pandas对数据进行分组统计



前言

在数据处理的过程,有可能需要对一堆数据分组处理,例如对不同的列进行agg聚合操作(mean,min,max等等),以下将介绍pandas中进行数据分组处理的方法


一、分组后进行sum操作

可以根据单列或者多列来对数据进行分组,分组后对特定列进行sum操作

代码如下(示例):

根据单列(job_title)对数据进行分组,对某列数据(salary_in_usd)进行sum

# 按照单列进行分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
# print(df)
df1 = df[['job_title', 'salary_in_usd']]
# print(df1)
df1 = df1.groupby('job_title').sum()
print(df1)

根据多列(job_title,employee_residence)进行分组,对某列数据(salary_in_usd)进行sum

# 按照多列进行分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
# print(df.columns)
df2 = df[['job_title', 'employee_residence', 'salary_in_usd']]
# print(df2)
df2 = df2.groupby(['job_title', 'employee_residence']).sum()
print(df2)

根据多列进行分组统计(job_title,work_year ),对多列中的特定列(salary_in_usd)进行sum操作

# 按照多列进行分组,并对特定列进行统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
# print(df.columns)
df2 = df[['job_title', 'work_year', 'salary_in_usd', 'employment_type']]
# print(df2)
df2 = df2.groupby(['job_title', 'work_year'])['salary_in_usd'].sum()
print(df2)

二、分组后进行迭代操作

代码如下(示例):

根据单列进行分组后,使用for循环进行迭代

# 单列分组,迭代查看
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
df1 = df[['job_title', 'salary_in_usd']]
df2 = df1.groupby('job_title')
print(df2) #groupby后产生一个DataFrameGroupBy对象
for name, group in df2:
    print(name)
    print(group)
    print('----------')

根据多列进行分组后,使用for循环进行迭代

# 多列分组,迭代查看
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
# print(df)
df1 = df[['job_title', 'work_year', 'salary_in_usd']]
df2 = df1.groupby(['job_title', 'work_year'])
for (k1, k2), group in df2:
    print(k1, k2)
    print(group)
    print('----------------')

三、分组后进行聚合agg操作

代码如下(示例):

分组后求平均值

# groupby和agg搭配使用
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
df1 = df[['job_title', 'salary_in_usd']]
df2 = df1.groupby('job_title').agg(['mean'])
print(df2)

分组后以字典的形式对特定列使用特定的聚合agg函数

# groupby和agg搭配使用,特定列使用特定聚合函数
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
# print(df)
df1 = df[['job_title', 'salary_in_usd', 'remote_ratio']]
# print(df1.head())
df2 = df1.groupby('job_title').agg( {'remote_ratio' : ['mean'], 'salary_in_usd' : ['max', 'min', 'mean']})
print(df2)

四、使用自定义函数进行统计

代码如下(示例):
自定义函数,配合agg进行分组统计

# 通过自定义函数实现分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_csv('ds_salaries.csv')
# print(df['job_title'].value_counts())
# 使用lambda创建匿名函数
maxcount = lambda x : x.value_counts().index[0]

# maxcount._name_ = '人数最多的岗位'
df1 = df.agg({'job_title' : [maxcount]})
print(df1)

五、使用dic、series进行分组统计

代码如下(示例):
使用dic进行分组统计

# 通过字典实现分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
index = ['zhangsan', 'lisi', 'wangwu']
columns = ['gaungzhou', 'shanghai', 'beijing', 'hangzhou']
data = [[10, 20, 30, 40], [90, 100, 20, 30], [66, 77, 88, 99]]
df = pd.DataFrame(data = data, index = index, columns = columns)
# print(df)
dic = {
    'gaungzhou' : '1',
    'shanghai' : '1',
    'beijing' : '2',
    'hangzhou' : '2'
}
df1 = df.groupby(dic, axis = 1).sum()
print(df1)

使用series进行分组统计

# 通过series对象是想分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
index = ['zhangsan', 'lisi', 'wangwu']
columns = ['gaungzhou', 'shanghai', 'beijing', 'hangzhou']
data = [[10, 20, 30, 40], [90, 100, 20, 30], [66, 77, 88, 99]]
df = pd.DataFrame(data = data, index = index, columns = columns)
# print(df)
dic = {
    'gaungzhou' : '1',
    'shanghai' : '1',
    'beijing' : '2',
    'hangzhou' : '2'
}
ss = pd.Series(dic)
# print(ss)
df1 = df.groupby(ss, axis = 1).sum()
print(df1)

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas中分组的操作,pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐