Pandas:将两列中的 null 值添加到 null

Pandas: Add null values in two columns to null

提问人:Kumar Arunachal 提问时间:10/8/2023 最后编辑:Kumar Arunachal 更新时间:10/8/2023 访问量:53

问:

我有一张如下表。

一个 B C
1.0 1.5 基线
基线
2.0 基线

我想在对前两列求和后插入一列,并希望得到如下所示的结果。

一个 B C
1.0 1.5 2.5 基线
基线
2.0 2.0 基线

我正在尝试的代码是, df.insert(2, 'Sum', df[['A', 'B']].sum(axis=1))

但我得到以下结果。

一个 B C
1.0 1.5 2.5 基线
0.0 基线
2.0 2.0 基线

我想将 NaN 的总和作为 NaN 保留在总和列中。有什么捷径可以做到这一点吗?

一些帖子建议,我可以做(df['A'].fillna('') + df['B'].fillna('')).replace('', np.nan))。但是浮点列不允许用 '' 替换 Nan。而且我有多个列要求和,并希望避免使用冗长的公式。任何建议将不胜感激!

熊猫 null

评论

3赞 ouroboros1 10/8/2023
嗨,欢迎来到SO!请提供一个最小的、可重复的例子。将数据示例添加为文本,而不是图片。例如,尝试在三个反引号 (''') 之间的块中发布。显示输入预期输出。df.to_dict()
2赞 OCa 10/8/2023
这个最小的可重现示例将特别让我们知道您到底拥有哪个 null 对象,以防万一。他们都是np.nan吗?

答:

2赞 Corralien 10/8/2023 #1

你可以使用 np.where

res = np.where(df[['A', 'B']].notna().any(axis=1),
               df[['A', 'B']].sum(axis=1), np.NaN)
df.insert(2, 'Sum', res)

输出:

>>> df
     A    B  Sum         C
0  1.0  1.5  2.5  Baseline
1  NaN  NaN  NaN  Baseline
2  2.0  NaN  2.0  Baseline

如果没有 numpy,您可以执行以下操作:

res = df[['A', 'B']].sum(axis=1)[df[['A', 'B']].notna().any(axis=1)]
df.insert(2, 'Sum', res)

另一种方式:

res = df[['A', 'B']].fillna(0, limit=1, axis=1).sum(axis=1, skipna=False)