目錄
1.簡介
(1)根據某些條件將數據拆分成組
(2)對每個組獨立應用函數
(3)將結果合並到一個數據結構中
Dataframe在行(axis=0)或列(axis=1)上進行分組,將一個函數應用到各個分組並產生一個新值,然后函數執行結果被合並到最終的結果對象中。
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
2.實戰演練
2.1 簡單分組統計並聚合
import pandas as pd
import numpy as np
df = pd.DataFrame({'科目' : ['語文', '語文', '語文', '數學','數學'],
'姓名' : ['Jack', 'Lucy', 'Alice', 'Mark', 'Jhon'],
'性別' : ['man', 'woman', 'woman', 'man', 'man'],
'成績' : [85, 90, 70, 60, 100]})
print(df)
print('------')
print(df.groupby('科目'), type(df.groupby('科目')))
print('------')
# 直接分組得到一個groupby對象,是一個中間數據,沒有進行計算
a = df.groupby('科目').mean()
b = df.groupby(['科目','性別']).mean()
c = df.groupby(['科目'])['成績'].mean() # 以A分組,算D的平均值
print(a,type(a),'\n',a.columns)
print(b,type(b),'\n',b.columns)
print(c,type(c))
# 通過分組后的計算,得到一個新的dataframe
# 默認axis = 0,以行來分組
# 可單個或多個([])列分組
2.2 分組-可迭代對象
import pandas as pd
import numpy as np
# 分組 - 可迭代對象
df = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]})
print(df)
print(df.groupby('X'), type(df.groupby('X')))
print('-----')
print('--------直接生成list或者元組---------------')
print(list(df.groupby('X')), '→ 可迭代對象,直接生成list\n')
print(list(df.groupby('X'))[0], '→ 以元祖形式顯示\n')
for n,g in df.groupby('X'):
print(n)
print(g)
print('###')
# n是組名,g是分組后的Dataframe
print('--------提取分組后的組-----------')
print(df.groupby(['X']).get_group('A'),'\n')
print(df.groupby(['X']).get_group('B'),'\n')
print('-----')
# .get_group()提取分組后的組
print('--------分組后的元素轉化為dict-----------')
grouped = df.groupby(['X'])
print(grouped.groups)
print(grouped.groups['A']) # 也可寫:df.groupby('X').groups['A']
# .groups:將分組后的groups轉為dict
# 可以字典索引方法來查看groups里的元素
print('---------查看分組后的長度-----------')
sz = grouped.size()
print(sz,type(sz))
# .size():查看分組后的長度
print('---------按照兩列進行分組-----------')
df = pd.DataFrame({'科目' : ['語文', '語文', '語文', '數學','數學'],
'姓名' : ['Jack', 'Lucy', 'Alice', 'Mark', 'Jhon'],
'性別' : ['man', 'woman', 'woman', 'man', 'man'],
'成績' : [85, 90, 70, 60, 100]})
grouped = df.groupby(['科目','性別']).groups
print(df)
print(grouped)
print('------------------')
print(grouped[('數學', 'man')])
# 按照兩個列進行分組
2.3 其他軸上的分組
import pandas as pd
import numpy as np
# 其他軸上的分組
df = pd.DataFrame({'data1':np.random.rand(2),
'data2':np.random.rand(2),
'key1':['a','b'],
'key2':['one','two']})
print(df)
print(df.dtypes)
print('-----')
for n,p in df.groupby(df.dtypes, axis=1):
print(n)
print(p)
print('##')
# 按照值類型分列
2.4 通過字典或者Series分組
import pandas as pd
import numpy as np
# 通過字典或者Series分組
df = pd.DataFrame(np.arange(16).reshape(4,4),
columns = ['a','b','c','d'])
print(df)
print('-----')
mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
by_column = df.groupby(mapping, axis = 1)
print(by_column.sum())
print('-----')
# mapping中,a、b列對應的為one,c、d列對應的為two,以字典來分組
s = pd.Series(mapping)
print(s,'\n')
print(s.groupby(s).count())
# s中,index中a、b對應的為one,c、d對應的為two,以Series來分組
2.5 通過函數分組
# 通過函數分組
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(16).reshape(4,4),
columns = ['a','b','c','d'],
index = ['abc','bcd','aa','b'])
print(df,'\n')
print(df.groupby(len).sum())
# 按照字母長度分組
2.6 分組函數計算方法
import pandas as pd
import numpy as np
s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3])
grouped = s.groupby(level=0) # 唯一索引用.groupby(level=0),將同一個index的分為一組
print(grouped)
print(grouped.first(),'→ first:非NaN的第一個值\n')
print(grouped.last(),'→ last:非NaN的最后一個值\n')
print(grouped.sum(),'→ sum:非NaN的和\n')
print(grouped.mean(),'→ mean:非NaN的平均值\n')
print(grouped.median(),'→ median:非NaN的算術中位數\n')
print(grouped.count(),'→ count:非NaN的值\n')
print(grouped.min(),'→ min、max:非NaN的最小值、最大值\n')
print(grouped.std(),'→ std,var:非NaN的標准差和方差\n')
print(grouped.prod(),'→ prod:非NaN的積\n')
2.7 多函數計算:agg()
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,1,2,2],
'b':np.random.rand(4),
'c':np.random.rand(4),
'd':np.random.rand(4),})
print(df)
print(df.groupby('a').agg(['mean',np.sum]))
print(df.groupby('a')['b'].agg({'result1':np.mean,
'result2':np.sum}))
# 函數寫法可以用str,或者np.方法
# 可以通過list,dict傳入,當用dict時,key名為columns