【问题标题】:Pandas: Creating aggregated column in DataFramePandas:在 DataFrame 中创建聚合列
【发布时间】:2018-08-21 09:04:29
【问题描述】:

以下面的DataFrame为例,

In [83]:
df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)})
df
Out[83]:
   A  B  values
0  1  1      10
1  1  2      15
2  2  1      20
3  2  2      25

生成一个新列的简单方法是什么,该列包含其中一个列上的一些数据聚合?

例如,如果我将 valuesA 中的项目相加

In [84]:
df.groupby('A').sum()['values']
Out[84]:
A
1    25
2    45
Name: values

我怎样才能得到

   A  B  values  sum_values_A
0  1  1      10            25
1  1  2      15            25
2  2  1      20            45
3  2  2      25            45

【问题讨论】:

标签: python pandas


【解决方案1】:
In [20]: df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)})

In [21]: df
Out[21]:
   A  B  values
0  1  1      10
1  1  2      15
2  2  1      20
3  2  2      25

In [22]: df['sum_values_A'] = df.groupby('A')['values'].transform(np.sum)

In [23]: df
Out[23]:
   A  B  values  sum_values_A
0  1  1      10            25
1  1  2      15            25
2  2  1      20            45
3  2  2      25            45

【讨论】:

    【解决方案2】:

    我找到了一种使用join的方法:

    In [101]:
    aggregated = df.groupby('A').sum()['values']
    aggregated.name = 'sum_values_A'
    df.join(aggregated,on='A')
    
    Out[101]:
       A  B  values  sum_values_A
    0  1  1      10            25
    1  1  2      15            25
    2  2  1      20            45
    3  2  2      25            45
    

    谁有更简单的方法?

    【讨论】:

      【解决方案3】:

      这不是那么直接,但我发现它非常直观(使用 map 从另一列创建新列)并且可以应用于许多其他情况:

      gb = df.groupby('A').sum()['values']
      
      def getvalue(x):
          return gb[x]
      
      df['sum'] = df['A'].map(getvalue)
      df
      

      【讨论】:

      • 谢谢,map 方法看起来很强大。肯定会经常使用它。
      【解决方案4】:
      In [15]: def sum_col(df, col, new_col):
         ....:     df[new_col] = df[col].sum()
         ....:     return df
      
      In [16]: df.groupby("A").apply(sum_col, 'values', 'sum_values_A')
      Out[16]: 
         A  B  values  sum_values_A
      0  1  1      10            25
      1  1  2      15            25
      2  2  1      20            45
      3  2  2      25            45
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-31
        • 2021-04-14
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        相关资源
        最近更新 更多