Подтвердить что ты не робот

Условно заполнять значения столбцов на основе другого значения столбцов в pandas

У меня есть DataFrame с несколькими столбцами. Один столбец содержит символ, для которого используется валюта, например знак евро или доллар. Другой столбец содержит бюджетное значение. Так, например, в одной строке это может означать бюджет в 5000 евро, а в следующей строке он может сказать, что бюджет 2000 долларов в долларах.

В pandas я хотел бы добавить дополнительный столбец в свой DataFrame, нормализуя бюджеты в евро. Таким образом, для каждой строки значение в новом столбце должно быть значением из столбца бюджета * 1, если символ в столбце валюты является знаком евро, а значение в новом столбце должно быть значением столбца бюджета * 0.78125, если символ в столбце валюты является знаком доллара.

Я знаю, как добавить столбец, заполнить его значениями, скопировать значения из другого столбца и т.д., но не как заполнить новый столбец условно на основе значения другого столбца.

Любые предложения?

4b9b3361

Ответ 1

Возможно, вы захотите сделать

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget'])

Ответ 2

Аналогичные результаты в альтернативном стиле могут заключаться в написании функции, которая выполняет требуемую операцию со строкой, с использованием синтаксиса row['fieldname'] для доступа к отдельным значениям/столбцам, а затем при выполнении над ней метода DataFrame.apply.

Это повторяет ответ на вопрос, связанный здесь: панды создают новый столбец на основе значений из других столбцов

def normalise_row(row):
    if row['Currency'] == '$'
    ...
    ...
    ...
    return result

df['Normalized'] = df.apply(lambda row : normalise_row(row), axis=1) 

Ответ 3

Взяв предложение Том Кимбер еще на один шаг, вы можете использовать словарь функций, чтобы установить различные условия для ваших функций. Это решение расширяет сферу охвата вопроса.

Я использую пример из личного приложения.

# write the dictionary

def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col):
    calculations = {
            'CPMV'  : df_name[metric_col] / 1000 * df_name[rate_col],
            'Free'  : 0
            }
    df_method = df_name[cost_method_col]
    return calculations.get(df_method, "not in dict")

# call the function inside a lambda

test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row,
cost_method_col='cost method',
metric_col='metric',
rate_col='rate',
total_planned_col='total planned'), axis = 1)

  cost method  metric  rate  total planned  spend
0        CPMV    2000   100           1000  200.0
1        CPMV    4000   100           1000  400.0
4        Free       1     2              3    0.0