【Python數據分析】分組統計groupby



分組統計groupby功能:

  • 根據某些條件,將數據拆成組
  • 對每個組獨立應用函數
  • 將結果合並到一個數據結構中

1.語法

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.基礎分組

import pandas as pd
import numpy as np

df = pd.DataFrame({'A':['Foo','Bar','Foo','Bar','Foo'],
                   'B':['one','two','three','one','two'],
                   'C':np.random.randn(5),
                   'D':range(5)
                  })
print(df)

print('------------')

print(df.groupby('A'),type(df.groupby('A'))) #此處得到的是一個groupby對象,並沒有進行計算
print('------------')
# 對A分組

a = df.groupby('A').mean() # 按A列分組后並對C跟D列進行求平均
print(a)

print('------------')

# 先對A分組,再對B分組,然后計算其平均值
b = df.groupby(['A','B']).mean()
print(b)

# 對A分組,然后對D列求平均值
print('------------')
c = df.groupby(['A'])['D'].mean()
print(c)

print('------------')

# 默認axis=0,按行來分組

輸出結果:

2.分組后可迭代對象操作

import pandas as pd
# 分組,可迭代對象
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(df.groupby('X')),'可迭代對象,直接生成list \n')
print(list(df.groupby('X'))[0],'以元組的形勢展示 \n')

for n,g in df.groupby('X'):
    print(n) # 組名
    print(g) # 組后跟的DataFrame
    print('******************')
print('------------------get_group()提取分組后的組--------------------')

print(df.groupby(['X']).get_group('A'),'\n')
print(df.groupby(['X']).get_group('B'),'\n')

print('-------------------')
# groups:將分組后的groups轉為dict,可以字典索引方法來查看groups里的元素
grouped = df.groupby(['X'])
print(grouped.groups)
print(grouped.groups['A'])  # 也可寫:df.groupby('X').groups['A']
print('-------------------')

# size():查看分組后的長度
sz = grouped.size()
print(sz,type(sz))
print('-----')

# 按照兩個列進行分組
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})
grouped = df.groupby(['A','B']).groups
print(df)
print(grouped)
print(grouped[('foo', 'three')])

輸出結果:

3.按照軸類型進行分組

# 按照軸類型進行分組
import pandas as pd
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('*************')

輸出結果:

4.通過字典或者Series進行分組

import pandas as pd
df = pd.DataFrame(np.arange(16).reshape(4,4), columns = ['a','b','c','d'])
print(df)
print('-------------------------')
# mapping中,a、b列對應的為one,c、d列對應的為two,以字典來分組
mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
by_column = df.groupby(mapping, axis = 1)
print(by_column.sum())

print('-------------------------')
# s中,index中a、b對應的為one,c、d對應的為two,以Series來分組
s = pd.Series(mapping)
print(s,'\n')
print(s.groupby(s).count())

輸出結果:

5.通過函數分組

import pandas as pd 
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())

輸出結果:

6.分組后常用數值函數

import pandas as pd
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')

輸出結果:

7.多函數計算

import pandas as pd
df = pd.DataFrame({'a':[1,1,2,2],
                  'b':[10,10,20,20],
                  'c':[100,100,200,200],
                  'd':[1000,1000,2000,2000]
                  })
print(df)
print('----------------------')
print(df.groupby('a').agg(['mean',np.sum])) # 即可以求平均數,也可以求和
print(df.groupby('a')['b'].agg({"mean","sum"}))

輸出結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM