【问题标题】:Pandas dataframe, how can I group by single column and apply sum to multiple column and add new sum column?Pandas 数据框,如何按单列分组并将总和应用于多列并添加新的总和列?
【发布时间】:2021-02-01 00:18:44
【问题描述】:

这应该很容易,但不知何故我找不到可行的解决方案。

我有一个看起来像这样的熊猫数据框:

Slno   Date         col2   col3   col4   col5  col6
0     01/02/20      2      1      2      5     d
1     03/02/20      5      1      2      4     g
2     04/02/20      5      1      2      5     h
3     05/02/20      4      1      2      6     e
4     08/02/20      8      1      2      5     g
5     05/02/20      8      1      2      8     r

**我想按日期分组,并将 col2、col3、col4、col5 的 sum() 逐行作为新列总计

这是我尝试过的:

df_new[Total] = df.groupby(['Date', sort=False])["col2", "col3", col4", "col5].sum(axis = 1)

它给出 ValueError: Wrong number of items passed 4, placement 意味着 1

我也试过了

         df = (df.groupby(['Date'])
         .agg(Total=('ConfirmedIndianNational', 'ConfirmedForeignNational', 'Cured', 'Deaths', 'sum'))
         .reset_index())

它给出了 TypeError: aggregate() missing 1 required positional argument: 'arg'

我是新的python,搜索了所有可能的解决方案,但没有新用途。

【问题讨论】:

  • 您有重复的日期吗?你为什么要分组?
  • 是的,我确实有重复的日期@anky

标签: python pandas dataframe pandas-groupby


【解决方案1】:

您可以将Date 设置为索引,然后对axis=1 上的列求和,然后groupby level=0 并转换sum

df['Total'] = (df.set_index('Date')[["col2", "col3","col4", "col5"]].sum(1)
           .groupby(level=0).transform('sum').to_numpy())

print(df)

   Slno      Date  col2  col3  col4  col5 col6  Total
0     0  01/02/20     2     1     2     5    d     10
1     1  03/02/20     5     1     2     4    g     12
2     2  04/02/20     5     1     2     5    h     13
3     3  05/02/20     4     1     2     6    e     32 # this is duplicated per group
4     4  08/02/20     8     1     2     5    g     16
5     5  05/02/20     8     1     2     8    r     32 # this is duplicated per group

【讨论】:

  • @NadeemHaque 很高兴我能帮上忙。干杯..!!
【解决方案2】:

不清楚每个日期是否有多个值。如果是这种情况,您的 group by 应该按您想要的任何函数聚合该列,并使用聚合执行行的总和。

例如,您想要每个日期的每列的最大值:

max_df = df.groupby('Date')(['Date'])["col2", "col3", "col4", "col5"].max()

然后:

max_df.loc[:,'sum_cols'] = max_df[["col2", "col3", "col4", "col5"]].sum(axis = 1)

如果你每个日期只有一行,你可以这样做:

df.loc[:,'sum_cols'] = df[["col2", "col3", "col4", "col5"]].sum(axis = 1)

【讨论】:

    【解决方案3】:

    你为什么不做一个简单的:

    df[Total] = df.groupby(['Date').col1.sum()+df.groupby(['Date').col2.sum()+df.groupby(['Date').col3.sum()+df.groupby(['Date').col4.sum()
    

    应该没问题。

    【讨论】:

      猜你喜欢
      • 2020-03-17
      • 2020-02-10
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2019-11-11
      • 2019-04-27
      相关资源
      最近更新 更多