У меня есть несколько фреймов данных, которые я объединяю на основе известных заполненных полей. Результирующий фрейм данных всегда будет содержать набор столбцов, но может иметь или не иметь значения для некоторых столбцов.
Вот фрагмент:
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 нет значений для использования, и мы получаем значения NaN в df. Я не могу сделать значения NaN по умолчанию для всего df, потому что для некоторых вычислений мы хотели бы рассматривать 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