添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在Python Pandas中,当条件不只是按行分组时,按组分组

0 人关注

我有两个数据框,一个是低层次的,一个是高层次的数据汇总。我想在汇总表中增加一个新的列,对所有是某项运动的球迷的总支出进行汇总。在足球的汇总行中,我不想对足球的总支出进行汇总,而是对任何在足球上花费的人的总体育支出进行汇总。

df = pd.DataFrame({'Person': [1,2,3,3,3],
                   'Sport': ['Soccer','Tennis','Tennis','Football','Soccer'],
                  'Ticket_Cost': [10,20,10,10,20]})
df2 = pd.DataFrame({'Sport': ['Soccer','Tennis','Football']})

我目前可以通过很多步骤来做这件事,但我确信有一个更有效/更快速的方法。 以下是我目前的做法。

#Calculate the total spend for each person in an temporary dataframe
df_intermediate = df.groupby(['Person'])['Ticket_Cost'].sum()
df_intermediate= df_intermediate.rename("Total_Sports_Spend")

人数 体育消费总额
1 10
2 20
3 40

#place this total in the detailed table
df = pd.merge(df,df_intermediate,how='left',on='Person')
#Create a second temporary dataframe
df_intermediate2 = df.groupby(['Sport'])['Total_Sports_Spend'].sum()

体育项目 总额_体育消费
Soccer 50
Tennis 60

#Merge this table with the summary table
df2 = pd.merge(df2,df_intermediate2,how='left',on='Sport')

体育项目 总额_体育消费
0 Soccer 50
1 Tennis 60
2 足球 40

最后,我清理了临时数据帧,并从详细表格中删除了多余的列。我相信有一个更好的方法。

python
performance
pandas-groupby
Jonathan Hay
Jonathan Hay
发布于 2020-09-06
1 个回答
Chris
Chris
发布于 2020-09-06
已采纳
0 人赞同

你可能想在2D中旋转你的DataFrame。

df2 = df.pivot_table(index = 'Person', columns = 'Sport', values = 'Ticket_Cost')

You get

Sport   Football    Soccer  Tennis
Person          
     1  NaN         10.0    NaN
     2  NaN         NaN     20.0
     3  10.0        20.0    10.0

现在你可以计算出每个人的总支出。

total = df2.sum(axis=1)

which is

Person
1    10.0
2    20.0
3    40.0
dtype: float64

最后,你把total的总支出值放在df2的单元格中,该单元格有一个正值。

df3 = (df2>0).mul(total, axis=0)

which is here:

Sport   Football    Soccer  Tennis
Person          
     1  0.0     10.0    0.0
     2  0.0     0.0     20.0
     3  40.0    40.0    40.0