如何聚合数据框中几列的值以使其具有 NaN,以防 Python Pandas 中的总和为 NaN 而不是 0?

问题描述 投票:0回答:1

我在 Python Pandas 中有数据框,如下所示:

输入数据:

df = pd.DataFrame({
    'id' : [999, 999, 999, 185, 185, 185, 999, 999, 999],
    'target' : [1, 1, 1, 0, 0, 0, 1, 1, 1],
    'event': ['2023-01-01', '2023-01-01', '2023-02-03', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'],
    'survey': ['2023-02-02', '2023-02-02', '2023-02-02', '2023-03-10', '2023-03-10', '2023-03-10', '2023-04-22', '2023-04-22', '2023-04-22'],
    'event1': [1, 6, 11, 16, np.nan, 22, 74, 109, 52],
    'event2': [2, 7, np.nan, 17, 22, np.nan, np.nan, 10, 5],
    'event3': [3, 8, 13, 18, 23, np.nan, 2, np.nan, 99],
    'event4': [4, 9, np.nan, np.nan, np.nan, 11, 8, np.nan, np.nan],
    'event5': [np.nan, np.nan, 15, 20, 25, 1, 1, 3, np.nan]
})

df

正如您在“event5”列中看到的 id = 999,对于该 id,事件 = 2023-01-01,我有 2 次 NaN。

要求:

我需要聚合该数据框,并对“事件”列中同一日期的每个 id 的 event1、event2、event3、event4、event5 列中的所有值求和。

例如,如果 id = 999 有 2 行,其中 event = 2023-01-01,我需要对 event1、event2、event3、event4、event5 列中的所有值求和,以使 id 具有一行。

我在 Python Pandas 中有这样的代码:

column_names = df.columns
df = df.groupby(["id","target", "survey", "event"]).agg({col: 'sum' for col in column_names if col not in ["id","target", "survey", "event"]})
df.reset_index(inplace = True)
df

尽管如此,当我使用该代码时,NaN 值的总和返回 0,但如果我必须对 NaN 值求和,我希望得到 NaN:

结果示例:

因此,我需要得到如下所示的结果,其中 NaN 的总和将为 NaN 而不是 0。

我如何修改我的代码来实现这一目标,或者也许您有其他想法?

python pandas dataframe sum aggregate
1个回答
0
投票

默认情况下,pandas 的

sum
会跳过 NaN,你可以通过
skipna=False
:

out = (df.groupby(["id","target", "survey", "event"], as_index=False)
         .agg(lambda x: x.sum(skipna=False))
       )
© www.soinside.com 2019 - 2024. All rights reserved.