pandas之数据分组groupby

类似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')
get_group查看分组内容和groups查看分组所在行

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'>
size统计分组的长度

分组可对单列或者多列进行,如果对多列进行分组,需要写在一个列表内。

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
groupby单列和多列分组

猜你喜欢

转载自www.cnblogs.com/Forever77/p/11288682.html