如何根据可能包含#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
我有一些数据框正在根据已知的填充字段进行合并。生成的数据框将始终包含一组列,但某些列可能有也可能没有值。
这是一个片段:
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