按组求和,保留NA

时间:2019-10-01 18:41:48

标签: python pandas

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

     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个NaNs行

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

2 个答案:

答案 0 :(得分:4)

我想自定义函数可以做到:

(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

答案 1 :(得分:4)

选中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