对熊猫来说,一组一组的聚合效果并不像预期的那样



我需要一些关于聚合和按输出连接数据帧的帮助。

这是我的数据帧:

df = pd.DataFrame({
'Date': ['2020/08/18','2020/08/18', '2020/08/18', '2020/08/18', '2020/08/18', '2020/08/18', '2020/08/18'],
'Time':['Val3',60,30,'Val2',60,60,'Val2'],
'Val1': [0, 53.5, 33.35, 0,53.5, 53.5,0],
'Val2':[0, 0, 0, 45, 0, 0, 35],
'Val3':[48.5,0,0,0,0,0,0],
'Place':['LOC_A','LOC_A','LOC_A','LOC_B','LOC_B','LOC_B','LOC_A']
})

我想要以下结果:

Place  Total_sum  Factor  Val2_new
0  LOC_A      86.85   21.71       35
1  LOC_B     107.00   26.75       45

我尝试过以下内容:

df_by_place = df.groupby('Place')['Val1'].sum().reset_index(name='Total_sum')
df_by_place['Factor'] = round(df_by_place['Total_sum']*0.25, 2)
df_by_place['Val2_new'] = df.groupby('Place')['Val2'].agg('sum')
print(df_by_place)

但我得到了以下结果:

Place  Total_sum  Factor  Val2_new
0  LOC_A      86.85   21.71       NaN
1  LOC_B     107.00   26.75       NaN

当我自己做以下操作时:

print(df.groupby('Place')['Val2'].agg('sum'))
Output is desired:
Place
LOC_A    35
LOC_B    45

但是当我分配给一列时;NaN";价值

对这个问题的任何帮助都将不胜感激。

提前谢谢。

熊猫中的Groupby>=0.25将允许您为其中的列指定名称,并一次完成您想要的操作。

df.groupby('Place').agg(Total_sum = ('Val1','sum'),
Factor = ('Val1', lambda x: round((x * 0.25).sum(),2)),
Val2_new = ('Val2', 'sum')).reset_index() 

这提供了您想要的结果。

Place   Total_sum   Factor  Val2_new
0   LOC_A   86.85       21.71   35
1   LOC_B   107.00      26.75   45

在groupby中使用lambda函数会让事情变得更整洁!

苏尚斯给出的答案似乎很好。

df_by_place['Val2_new'] = df.groupby('Place')['Val2'].agg('sum').reset_index(drop=True)

通过在reset_index中指定drop=True,将删除以前创建的索引,并指定用户给定的新索引/column_name。

@maishm的答案略有变化,但基本上相同的想法:

df.groupby('Place').agg(total_sum=pd.NamedAgg(column='Val1', aggfunc=sum), 
factor=pd.NamedAgg(column='Val1', aggfunc=lambda x: round(sum(x)*0.25,2)), 
val2_new=pd.NamedAgg(column='Val2', aggfunc=sum)).reset_index()

输出:

Place  total_sum  factor  val2_new
0  LOC_A      86.85   21.71        35
1  LOC_B     107.00   26.75        45

最新更新