我有一个 pandas 数据框,如下所示:
Name Missed Credit Grade
A 1 3 10
A 1 1 12
B 2 3 10
B 1 2 20
我想要的输出是:
Name Sum1 Sum2 Average
A 2 4 11
B 3 5 15
基本上是获得列
Credit
和Missed
的总和并对Grade
求平均值。我现在正在做的是 Name
上的两个 groupby,然后获取总和和平均值,最后合并两个输出数据帧,这似乎不是执行此操作的最佳方法。我也在 SO 上发现了这一点,如果我只想在一个专栏上工作,这是有意义的:
df.groupby('Name')['Credit'].agg(['sum','average'])
但不确定如何为两列都做一行行?
agg
到 dictionary
,然后 rename
列名称:
d = {'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}
df=df.groupby('Name').agg({'Missed':'sum', 'Credit':'sum','Grade':'mean'}).rename(columns=d)
print (df)
Sum1 Sum2 Average
Name
A 2 4 11
B 3 5 15
如果还想从
Name
创建列:
df = (df.groupby('Name', as_index=False)
.agg({'Missed':'sum', 'Credit':'sum','Grade':'mean'})
.rename(columns={'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}))
print (df)
Name Sum1 Sum2 Average
0 A 2 4 11
1 B 3 5 15
具有命名聚合的解决方案:
df = df.groupby('Name', as_index=False).agg(Sum1=('Missed','sum'),
Sum2= ('Credit','sum'),
Average=('Grade','mean'))
print (df)
Name Sum1 Sum2 Average
0 A 2 4 11
1 B 3 5 15
A = pd.DataFrame.from_dict({'Name':['A','A','B','B'],'Missed':[1,1,2,1],'Credit':[3,1,3,2],'Grades':[10,12,10,20]})
A.groupby('Name').agg({'Missed':'sum','Credit':'sum','Grades':'mean'})
当我尝试使用 groupby 操作创建数据帧同一列的平均值和总和时,偶然发现了这个问题。 jezrael 答案的最后一部分也适用于相同的列。例如,使用上面相同的数据设置,您可以获得在
Grade
列上分区的 Name
列的平均值和总和:
grouped_df = df.groupby('Name').agg(avg_grade = ('Grade', 'mean'),
total_grade = ('Grade', 'total'))
print(grouped_df)
avg_grade total_grade
Name
A 11.0 22
B 15.0 30
因此,我将这个答案留在这里,供那些遇到类似问题的人使用。