类似excel的数据透视表,一般是按照行进行分组,使用方法如下。
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True,
squeeze=False, observed=False, **kwargs)
分组得到的直接结果是一个DataFrameGroupBy对象。
df = pd.DataFrame({'A':['zhao','li','wang','li','zhao'], 'B':['one','one','two','three','two'], 'C':np.arange(1,6), 'D':np.arange(6,11)}) print(df) print(df.groupby('A')) print(type(df.groupby('A'))) # A B C D # 0 zhao one 1 6 # 1 li one 2 7 # 2 wang two 3 8 # 3 li three 4 9 # 4 zhao two 5 10 # <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000000001E6C550> # <class 'pandas.core.groupby.generic.DataFrameGroupBy'>
分组后的直接结果是一个可迭代对象,可迭代对象中的每一个元素都是一个元组,元组的第一个值为分组的名称,第二个值为DataFrame。可通过for或转换为list、元组查看每一个元素。
for n,p in df.groupby('A'): print(type(p)) print(n) print(p) print('-------------------------') # <class 'pandas.core.frame.DataFrame'> # li # A B C D # 1 li one 2 7 # 3 li three 4 9 # ------------------------- # <class 'pandas.core.frame.DataFrame'> # wang # A B C D # 2 wang two 3 8 # ------------------------- # <class 'pandas.core.frame.DataFrame'> # zhao # A B C D # 0 zhao one 1 6 # 4 zhao two 5 10 # -------------------------
通过get_group('分组名称')获取某一个分组的内容
groups是一个字典,字典的键为各分组名称,值为列表包含分组所在的索引行,可通过groups['分组名称']查看某一个分组所在的行
print(df.groupby('A').get_group('zhao')) #获取分组后的zhao组 # A B C D # 0 zhao one 1 6 # 4 zhao two 5 10 print(df.groupby(['A','B']).groups) print(df.groupby(['A','B']).groups[('li', 'one')]) # {('li', 'one'): Int64Index([1], dtype='int64'), ('li', 'three'): Int64Index([3], dtype='int64'), ('wang', 'two'): Int64Index([2], dtype='int64'), ('zhao', 'one'): Int64Index([0], dtype='int64'), ('zhao', 'two'): Int64Index([4], dtype='int64')} # Int64Index([1], dtype='int64')
size统计每个分组的长度
print(df.groupby('A').size()) print(type(df.groupby('A').size())) # A # li 2 # wang 1 # zhao 2 # dtype: int64 # <class 'pandas.core.series.Series'>
分组可对单列或者多列进行,如果对多列进行分组,需要写在一个列表内。
df = pd.DataFrame({'A':['zhao','li','wang','li','zhao'], 'B':['one','one','two','three','two'], 'C':np.arange(1,6), 'D':np.arange(6,11)}) print(df.groupby('A').sum()) #以A列分组,对其他元素为数值的列进行求和,忽略非数值元素的列 print('---------------------') print(df.groupby(['A','B']).sum()) #以A列和B列分组,对其他列求和,忽略非数值元素的列 print('---------------------') print(df.groupby('A')['D'].sum()) #以A列分组,再对D列求和 C D # A # li 6 16 # wang 3 8 # zhao 6 16 # --------------------- # C D # A B # li one 2 7 # three 4 9 # wang two 3 8 # zhao one 1 6 # two 5 10 # --------------------- # A # li 16 # wang 8 # zhao 16 # Name: D, dtype: int32