如何根据可能包含#s 或 NaN 的其他列的值创建新列?

How to create a new columns based off of values of other columns which could contain #s or NaN?

我有一些数据框正在根据已知的填充字段进行合并。生成的数据框将始终包含一组列,但某些列可能有也可能没有值。

这是一个片段:

    df = df.merge(
        how="left",
        right=ins_df,
        left_on=["warehouse", "date"],
        right_on=["ware_id", "c_date"],
    ).merge(
        how="left",
        right=ware_df,
        left_on=["warehouse", "date"],
        right_on=["warehouse_code", "warehouse_date"],
    )

我得到了一个由几列组成的数据框,我们称它们为 A、B、C、D 和 E。

我需要创建新列 F、G 和 H。F 需要像 A + B - C 一样计算,G 需要根据 max(A + B + C, E - D), H需要是C * D等等

这会相对简单,但我 运行 陷入困境,因为我不知道应该如何处理 NaN。当我们合并时,有时 ins_df 或 ware_df 中没有值可供使用,我们在 df 中得到 NaN 值。我不能对 NaN 值进行 df-wide 默认,因为对于某些计算,我们希望将 NaN 视为 0,例如,而在其他计算中,我们希望将 NaN 视为 -1 或什至不填充如果其中一个字段为 NaN,则为一个字段(例如对于 H,如果 C 或 D 为 NaN,我们不想计算 H。但是对于 G,如果 C 为 NaN,我们希望将其视为 0)

在我的计算中有没有一种简单的方法可以做到这一点?例如,像这样

df['G'] = max(df.get('A', default=0) + df.get('B', default=1) + df.get('C', default=0), df.get('E', default=-1))

df['H'] = df['C'] * df['D'] if ['C', 'D'] in df.columns else 0

使用以下玩具数据框:

import pandas as pd

df = pd.DataFrame(
    {
        "A": [8, 5, 2],
        "B": [4, pd.NA, 3],
        "C": [1, 1, 8],
        "D": [pd.NA, 7, 2],
        "E": [5, 5, pd.NA],
    }
)

这是一种方法:

# For G, if A is NaN, we want to treat it as 0, etc.
df["G"] = pd.concat(
    [df["A"].fillna(0) + df["B"].fillna(1) + df["C"].fillna(0), df["E"].fillna(-1)],
    axis=1,
).max(axis=1)

# For H, if C or D is NaN, we don't want to calculate H
df["H"] = df["C"] * df["D"]
print(df)
# Output
   A     B  C     D     E   G     H
0  8     4  1  <NA>     5  13  <NA>
1  5  <NA>  1     7     5   7     7
2  2     3  8     2  <NA>  13    16