【问题标题】:Sum by groups, preserving NAs按组求和,保留 NA
【发布时间】:2019-10-02 03:03:59
【问题描述】:

我正在尝试聚合数据框,以便每行(每个组)有一个日期。

     Cod1       Cod2    Date     E   A       S
327 100013.0    001 2019-02-01  0.0 0.0    511.0
323 100013.0    001 2019-02-01  0.0 -14.0   NaN
336 100013.0    001 2019-02-02  0.0 -28.0   NaN
341 100013.0    001 2019-02-03  0.0 -6.0    NaN
350 100013.0    001 2019-02-03  0.0 -3.0    NaN
373 100013.0    001 2019-02-07  0.0 -15.0   0
377 100013.0    001 2019-02-07  0.0 -9.0    NaN

使用以下内容:

df = df.groupby(['Date', 'Cod1', 'Cod2'])['E','A', 'S'].sum()

我得到以下输出:

2019-02-01  100013.0    001 0.0 -14.0   511.0
2019-02-02  100013.0    001 0.0 -28.0   0.0
2019-02-03  100013.0    001 0.0 -9.0    0.0
2019-02-06  100013.0    001 0.0 -24.0   0.0

我的问题是:

  • 有什么方法可以聚合保留 NaN 吗?

会有3个场景:

1 -) 同一日期的两行,最后一列具有 NaN 和非空数字:

327 100013.0    001 2019-02-01  0.0 0.0    511.0
323 100013.0    001 2019-02-01  0.0 -14.0   NaN

我希望在这种情况下始终保留该号码。

2-) 同一日期的两行,最后一列有 2 个 NaN 行

341 100013.0    001 2019-02-03  0.0 -6.0    NaN
350 100013.0    001 2019-02-03  0.0 -3.0    NaN

我希望在这种情况下始终保留 NaN。

3-) 同一日期的两行,最后一列有一个零值列和一个 NaN 列

373 100013.0    001 2019-02-07  0.0 -15.0   0
377 100013.0    001 2019-02-07  0.0 -9.0    NaN

我希望在这种情况下始终保持 0。


所以我的预期应该是这个:

2019-02-01  100013.0    001 0.0 -14.0   511.0
2019-02-02  100013.0    001 0.0 -28.0   NaN
2019-02-03  100013.0    001 0.0 -9.0    NaN
2019-02-06  100013.0    001 0.0 -24.0   0.0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    查看min_count

    df.groupby(['Date', 'Cod1', 'Cod2'])['E','A', 'S'].sum(min_count=1)
    Out[260]: 
                                E     A      S
    Date       Cod1     Cod2                  
    2019-02-01 100013.0 1     0.0 -14.0  511.0
    2019-02-02 100013.0 1     0.0 -28.0    NaN
    2019-02-03 100013.0 1     0.0  -9.0    NaN
    2019-02-07 100013.0 1     0.0 -24.0    0.0
    

    【讨论】:

      【解决方案2】:

      我猜一个自定义函数可以做到:

      (df.groupby(['Date', 'Cod1', 'Cod2'])
          ['E','A', 'S']
          .agg(lambda x: np.nan if x.isna().all() else x.sum())
      )
      

      输出:

                                  E     A      S
      Date       Cod1     Cod2                  
      2019-02-01 100013.0 1     0.0 -14.0  511.0
      2019-02-02 100013.0 1     0.0 -28.0    NaN
      2019-02-03 100013.0 1     0.0  -9.0    NaN
      2019-02-07 100013.0 1     0.0 -24.0    0.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多