它是一个MultiIndex对象
设置多个列索引:set_index([‘a’,‘b’],inplace=True),注意a,b顺序,若不同则有区别
选取子集:
交换层级顺序:swaplevel()
层级索引排序:sort_index(level=)
分组:对数据集进行分组 ,然后对每组进行统计分析
聚合:数组产生标量的过程,如mean(),count()等,常用于对分组后的数据进行计算。
分组运算过程:
内置的聚合函数:sum()、mean()、max()、min()、count()
(1) 按单列分组
obj.groupby(‘label’)
(2)多列分组
obj.groupby([‘label’,‘label2’])产生多层DataFrame
(1)groupby()操作后产生GroupBy对象,分为DataFrameGroupBy和SeriesGroupBy
(2)GroupBy对象没有进行实际运算,只是包含分组的中间数据,只有在经过聚合操作后才会产生结果,常用的聚合操作有mean(),max(),size()【每一个分组的大小】,count()
(3)非数值数据不进行分组运算
方法一:groupby()中传入自定义函数进行分组,操作针对的是索引
# 代码片段举例
def get_score_group(score):
if score<60:
score_group = 'low'
elif score<=80:
score_group='middle'
else:
score_group='high'
data2=data.set_index('Score') # 1、将Score列设置为索引列
data2.groupby(get_score_group).size() # 2、查看每个分组大小
方法二:项目中,可以先人为构造一个分组列,然后进行groupby
data['score_group']=data['Score'].apply(get_score_group)# 对Score列应用get_score_group函数
data.head() # 可以看到多了一列,名为score_group
data.groupby('score_group').size() # 使用groupby函数进行分类
使用agg()函数
以下两个语句等价
data.groupby('Region').max()
data.groupby('Region').agg(np.max)
(1)传入多个函数的列表
data.('Region')['HappinessScore'].agg([np.max,np.min,np.mean])
'''
运行结果的列名为Region np.max np.min np.mean
'''
(2)通过字典为每个列指定不同的操作方法
data.('Region').agg({'HappinessScore':np.mean,'HappinessRank':np.max})
'''
运行结果列名为Region HappinessRank HappinessScore
'''
(3)传入自定义函数
def max_min_diff(x):# 查看两极分化程度
return x.max()-x.min()
data.groupby('Region')['HappinessRank'].agg(max_min_diff)
计算,汇总和分析数据的强大工具
创建包含名称,学期,成绩,课程四列的表格
df.pivot_table(values,index,columns,aggfunc,margins)
values:透视表中的元素值(根据聚合函数所得)
index:透视表的行索引
columns:透视表的列索引
aggfunc:聚合函数,可以指定多个函数
margins:表示是否对所有数据进行统计,默认为false
按照指定轴的方向对多个数据对象进行数据合并
pd.concat(objs,axis)
axis为0则代表按照索引方向进行拼接(纵向),为1代表按照列方向(横向)
objs:多个数据对象,包含DataFrame的列表
注意:默认使用outer join合并
纵向合并:pd.concat([df1,df2],axis=0)
若列名相同,则正常合并,若列名不同,则进行列名的扩展,对应不上的位置为NaN
merge()
适用于层级索引对象
stack()将数据的列旋转为行,如下图,其实和我们前面的透视表很像,只是这里的重构并没有对数据进行聚合操作
参数level:索引的层级,默认为-1,表示最里面的一层。如上图所示,从左往右是level0,level1…,那么从右往左的第一个就是-1