資料分組
- 使用
groupby()方法進行分組 - group.
size()查看分組后每組的數量 - group.
groups查看分組情況 - group.
get_group('名字')根據分組后的名字選擇分組資料
準備資料
# 一個Series其實就是一條資料,Series方法的第一個引數是data,第二個引數是index(索引),如果沒有傳值會使用默認值(0-N)
# index引數是我們自定義的索引值,注意:引數值的個數一定要相同,
# 在創建Series時資料并不一定要是串列,也可以將一個字典傳進去,
from pandas import Series, DataFrame
# 使用字典創建
index_list = ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010']
name_list = ['李白', '王昭君', '諸葛亮', '狄仁杰', '孫尚香', '妲己', '周瑜', '張飛', '王昭君', '大喬']
age_list = [25, 28, 27, 25, 30, 29, 25, 32, 28, 26]
gender_list = ['F', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M']
salary_list = ['10k', '12.5k', '20k', '14k', '12k', '17k', '18k', '21k', '22k', '21.5k']
marital_list = ['NO', 'NO', 'YES', 'YES', 'NO', 'NO', 'NO', 'YES', 'NO', 'YES']
dic = {
'姓名': Series(data=name_list, index=index_list),
'年齡': Series(data=age_list, index=index_list),
'薪資': Series(data=salary_list, index=index_list),
'性別': Series(data=gender_list, index=index_list),
'婚姻狀況': Series(data=marital_list, index=index_list)
}
df = DataFrame(dic)
# 寫入csv,path_or_buf為寫入文本檔案
df.to_csv(path_or_buf='./People.csv', encoding='utf_8_sig')
print('end')
- 上面代碼會在當前目錄下生成一個
People.csv檔案
import pandas as pd
df = pd.read_csv('./People.csv')
df.head()

# 根據 '性別列' 進行分組, 得到的是一個分組后的物件
groups = df.groupby('性別')
print(groups)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002953DAEBC88>
size()
使用groupby的size方法可以查看分組后每組的數量, 并回傳一個含有分組大小的Series
print(groups.size())
性別
F 5
M 5
dtype: int64
可以只對一列資料進行分組, 只保留想要的資料
例如: 通過性別, 只對年齡進行分組
group = df['年齡'].groupby(df['性別'])
# 查看分組
print(group.groups)
# 根據分組后的名字選擇分組
print(group.get_group('F'))
{'F': Int64Index([0, 2, 3, 6, 7], dtype='int64'), 'M': Int64Index([1, 4, 5, 8, 9], dtype='int64')}
0 25
2 27
3 25
6 25
7 32
Name: 年齡, dtype: int64
- 代碼
df['年齡'].groupby(df['性別'])的邏輯是:取出df中’年齡’列資料,并且對該列資料根據df[‘性別’]列資料進行分組操作 - 這個代碼也可寫成
df.groupby(df['性別'])['年齡'], 他的邏輯是: 將df資料通過df[‘性別’]進行分組,然后再取出分組后的’年齡’列資料,兩種寫法達到的效果是一樣的 group.groups的結果是一個字典,字典的key是分組后每個組的名字,對應的值是分組后的資料,此方法方便我們產看分組的情況group.get_group('F')這個方法可以根據具體分組的名字獲取,每個組的資料
對分組進行遍歷
import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性別')
# print(groups)
for group_name,group_df in groups:
print('分組的名稱:', group_name, '分組的資料', group_df.shape)
print('-'*10)
分組的名稱: F 分組的資料 (5, 6)
----------
分組的名稱: M 分組的資料 (5, 6)
----------
- 將分組后的物件groups進行遍歷,可以獲取到group_name每個組的名字,group_df每個組的資料
import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性別')
for group_name,group_df in groups:
f_mean = group_df['年齡'].mean()
f_max = group_df['年齡'].max()
f_min = group_df['年齡'].min()
print('{}組的最大年齡是{},最小年齡是{},平均年齡是{}'.format(group_name,f_max,f_min,f_mean))
F組的最大年齡是32,最小年齡是25,平均年齡是26.8
M組的最大年齡是30,最小年齡是26,平均年齡是28.2
按多列進行分組
- 當需要按照多列進行分組的時候, groupby 方法里面我們傳入一個串列, 串列分別存盤分組依據的列名
- 注意: 串列中列名的順序, 確定了先按XXXX列分組, 然后在按照YYYY列分組, 不同的順序產生的分組名字是不同的
df = pd.read_csv('./People.csv')
group=df.groupby(['性別', '婚姻狀況'])
df1 = group.size()
print(df1)
性別 婚姻狀況
F NO 2
YES 3
M NO 4
YES 1
dtype: int64
- group.size()回傳的結果中發現索引值是多層的, 所以對于多索引值的獲取, 只需要從外往里一層一層的取就可以啦, 就像我們睡覺之前,需要先脫外衣再脫掉內衣是一樣的
size = df1['F'][ 'NO']
print(size)
2
pandas 常用統計函式
count()統計串列中非空手機開的個數nunique()統計非重復的資料個數sum()統計串列中所有數值的和mean()計算串列中資料的平均值median()統計串列中資料中位數max()求串列中資料的最大值min()求串列中資料的最小值
對分組后的資料進行統計 agg()
import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性別')
for group_name,group_df in groups:
f_se = group_df['年齡'].agg(['max','min','mean'])
print('{}組的最大年齡是{},最小年齡是{},平均年齡是{}'.format(group_name,f_se[0],f_se[1],f_se[2]))
F組的最大年齡是32.0,最小年齡是25.0,平均年齡是26.8
M組的最大年齡是30.0,最小年齡是26.0,平均年齡是28.2
- 在使用
agg()函式時, 我們可以將多個統計函式一起放在一個 agg() 函式中 - 如果是統計函式是pandas 提供的, 只需要將函式名字以字串的形式存盤到串列中即可
- 例如: 將 max() 改成 ‘max’
自定義統計函式
當使用自定義的統計函式時
先創建統計函式
# 自定義的統計函式
def my_peak_range(df):
"""
回傳最大值與最小之間的范圍
"""
return df.max() - df.min()
# 使用
for group_name,group_df in groups:
f_se = group_df['年齡'].agg(['max','min','mean',my_peak_range])
print(f_se[0],f_se[1],f_se[3])
32.0 25.0 7.0
30.0 26.0 4.0
- 注意: 自定義函式名字傳入
agg()函式時, 不需要轉換成字串
補充: 在這個資料中, 性別是什么的人總年齡最高
import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性別')
gende=groups.sum().sort_values(by='年齡',ascending=False).index.to_list()[0]
"""
這行代碼, 先按性別進行分組, 然后吧每組中的資料求和得到總的年齡, 在按照年齡排序
再取出index,最后使用to_list()轉換為串列,取出第一個資料
"""
print(gende)
M
- 開始按照性別分組, 組量太少, 資料也比較少, 本來準備算薪資總數, 但是單位忘記換了, 就這樣吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265919.html
標籤:python
