我在 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。
我如何修改我的代码来实现这一目标,或者也许您有其他想法?
默认情况下,pandas 的
sum
会跳过 NaN,你可以通过 skipna=False
:
out = (df.groupby(["id","target", "survey", "event"], as_index=False)
.agg(lambda x: x.sum(skipna=False))
)