下面是关于“pandas数据分组和聚合操作方法”的完整攻略。
在进行数据分组和聚合操作前,我们需要掌握以下基础知识:
pandas中的数据分组可以使用GroupBy对象,GroupBy对象的创建可以通过对DataFrame进行groupby方法调用实现。groupby方法的参数包括要分组的列或多列的名称。
import pandas as pd
data = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]})
grouped = data.groupby('A') # 按照A列进行分组
for key, value in grouped:
print(key)
print(value)
以上代码中,创建了一个DataFrame和一个GroupBy对象,按照A列进行分组,将DataFrame按照A列中不同的值划分为foo和bar两个组,for循环遍历每个组的名称和对应的数据。
分组完成后,可以进行聚合操作,pandas支持的聚合操作包括sum、mean、count等,对应着分别对数据求和、求均值和计数等操作。
import pandas as pd
data = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]})
grouped = data.groupby('A') # 按照A列进行分组
result = grouped.sum() # 对每组的数值列求和
print(result)
以上代码中,通过groupby方法对DataFrame进行分组(按照A列),然后使用sum方法对每组的数值列求和,获得了每个分组的总和。
pandas还支持自定义聚合函数,可以使用apply方法对每个分组进行自定义操作。apply方法接受一个函数作为参数,该函数的输入是每个分组的数据,输出是聚合后的结果。
import pandas as pd
def my_func(data):
return data['C'].sum() / data['D'].mean()
data = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]})
grouped = data.groupby('A') # 按照A列进行分组
result = grouped.apply(my_func) # 对每组数据执行自定义操作
print(result)
以上代码中,定义了一个自定义函数my_func,对每个组的数据进行自定义操作。apply方法将这个函数作为参数输入,对每组数据执行自定义操作,并返回操作后的结果。
为了更好地理解分组和聚合操作的实现和意义,下面给出两个示例说明。
我们有一份销售数据的DataFrame,包括日期、销售量、类别等信息。我们希望按照不同类别的销售量总和进行排序。
import pandas as pd
data = pd.DataFrame({'date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05'],
'category': ['fruit', 'vege', 'meat', 'fruit', 'vege', 'meat', 'fruit', 'vege', 'meat', 'fruit'],
'sales': [100, 150, 200, 120, 180, 230, 110, 170, 190, 130]})
grouped = data.groupby('category')
result = grouped.sum().sort_values('sales', ascending=False)
print(result)
以上代码中,使用groupby方法将DataFrame按照类别列进行分组,然后对每组数据的销售量列进行求和操作,最后按照销售量降序排列输出结果。
我们有一组学生成绩数据,包括每个学生的姓名、科目和成绩等信息。我们希望纵向统计每个学生的成绩平均值,并按照平均值进行降序排列。
import pandas as pd
data = pd.DataFrame({'name': ['Tom', 'Jack', 'Tom', 'Tom', 'Jack', 'Lucy', 'Lucy', 'Lucy'],
'subject': ['math', 'math', 'math', 'English', 'English', 'math', 'English', 'math'],
'score': [80, 90, 70, 85, 92, 88, 82, 91]})
grouped = data.groupby('name')
result = grouped.mean().sort_values('score', ascending=False)
print(result)
以上代码中,使用groupby方法将DataFrame按照姓名列进行分组,然后对每个分组中的成绩列进行平均值操作,最后按照平均值降序排列输出结果。
本文链接:http://task.lmcjl.com/news/17466.html