Как создать новый столбец на основе значений других столбцов, которые могут содержать #s или 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 нет значений для использования, и мы получаем значения 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Со следующим игрушечным фреймом данных:

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

Другие вопросы по теме