人工智能学习----Pandas进阶及统计分析
目录
• 基本数据对象及操作
• 数据清洗
• 数据合并及分组
• 透视表
一、基本数据对象及操作
1、Series
• 类似一维数组的对象
• 通过list构建Series
○ ser_obj = pd.Series(range(10))
• 由数据和索引组成
○ 索引在左,数据在有
○ 索引是自动创建的
**Series索引**
• 获取数据和索引
○ ser_obj.index, ser_obj.values
• 预览数据
○ ser_obj.head(n) #预览数据的前n行
• 通过索引名(字符串)获取数据,ser_obj['name'],或ser_obj.loc['name']
○ 如果索引名不存在则创建一项记录
• 通过索引位置(整型数据)获取数据源,ser_obj.iloc[2]
• 通过dict构建Series
• name属性
○ ser_obj.name: 给数据命名
○ ser_obj.index.name: 给索引命名
• Pandas会根据数据类型自动处理缺失数据
○ object---->None
○ float----->NaN
2、DataFrame
• 类似多维数组/表格数据
• 每列数据可以是不同类型
• 索引包括行索引(index)和列索引(label)
创建DataFrame
• 通过ndarray构建DataFrame
• 通过dict构建
○ data = {'key': values, …..}
df = pd.DataFrame(data,index=[…]
• 添加
○ df['a'] = […..]
DataFrame索引
• 按行索引
○ print(df.loc['CH']) #根据行的名称
○ print(df.il oc[1]) #根据行的位置
• 按列索引
○ print(df['Area'])
○ 不连续索引:df_obj[ [‘label1’, ‘label2’] ]
• 切片索引,ser_obj[2:4], ser_obj[‘label1’: ’label3’]
○ 注意,按索引名切片操作时,是包含终止索引的。
• 注意从DataFrame中取出的数据进行操作后,会对原始数据产生影响。为了保证不对原始数据产生影响,应该使用copy()产生一个副本。在副本上进行 操作。
删除数据操作
• df.drop('CH') #注意此操作不会对原始数据产生影响
• df.drop(['CH'],inplace = True) #会对原始数据产生影响
• df.drop(['Region'], axis = 1, inplace = True) ##删除列时,需要指定axis = 1,删除行时不需要因为axis默认为0
• 也可用 del df['Area']
DataFrame操作与加载
• ranks = df['Happiness Rank']
ranks = ranks+2 #此种操作会对原始数据产生影响,尽量不要用
• ranks = df['Happiness Rank'].copy() #用copy方法不会改变原始数据
ranks += 2
数据读取
• pd.read_csv('filename', index_col = ' …', usecols = '…')
○ index_col: 指定索引列
○ usecols:指定需要读取的列
• reprot_2016_df.head(n) # 数据预览
Boolean Mask
层级索引
• MultiIndex对象
• set_index([‘a’,’b’], inplace=True),注意a, b的先后顺序
• 选取子集 • 外层选取 ser_obj.loc[‘outer_index’]
• 内层选取 ser_obj.loc[‘out_index’, ‘inner_index’]
• 常用于分组操作、透视表的生成等
• 交换分层顺序
○ swaplevel()
• 排序分层
○ sort_index(level= )
二、数据清洗
1、处理缺失数据
• 判断数据缺失
○ ser_obj.isnull(), df_obj.isnull(),相反操作为notnull()
• 处理缺失数据
• df.fillna(n),将缺失值置为n
• df.dropna() ,将缺失值删除
• df.ffill(),按之前的数据填充
• df.bfill(),按之后的数据填充
• 项目中使用ffill或bfill时,注意数据的排列顺序
2、数据变形
• 处理重复数据
○ data.duplicated(),判断数据是否重复
○ 去除重复数据,data.drop_duplicates()
○ data.drop_duplicates(['k1']),# 去除指定列的重复数据; data.drop_duplicates(['k1','k2'], keep = 'last') #keep指定保留哪一个
• 使用函数或map转化数据
○ 使用函数或map转化数据,通常根据字典进行数据转化
○ data['animal'] = lowercased.map(meat_to_animal)
○ #使用方法来添加,lambda函数
○ data['animal2'] = data['food'].map(lambda x: meat_to_animal[x.lower()])
• 替换值,replace()
○ data.replace(-999,np.nan),将-999替换为nan
• 离散化和分箱操作
• ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
• #分箱边界
• bins = [18, 25, 35, 60, 100]
• cats = pd.cut(ages, bins)
• 哑变量操作
○ pd.get_dummies()
• 向量化字符串操作
• 字符串列元素中是否包含子字符串,ser_obj.str.contains()
• 字符串列切片操作,ser_obj.str[a:b]
• split_df = data.str.split('@', expand = True) #以@为分隔符,将邮箱分开,expand默认是False
• split_df[0].str.cat(split_df[1], sep = '@') #将字符串合并,以@连接
三、数据合并及分组
1、数据分组
• groupby
○ grouped = reprot_data.groupby('Region')
○ grouped.size() #返回每个分组的元素个数