Умножение нескольких столбцов на несколько столбцов в месте

#python #pandas #database

#python #панды #База данных

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

               ivol  Front Face  Back Face  Left Face  Right Face  Front jvol  Back jvol  Left jvol  Right jvol  
    row col                                                                                                    
    99  49   5792          1           1          1          0        5734        5850       5791       5793   
        50   5793          1           1          0          0        5735        5851       5792       5794   
        51   5794          1           1          0          0        5736        5852       5793       5795   
        52   5795          1           1          0          0        5737        5853       5794       5796 
 

Мне нужно умножить определенные столбцы ( xxx Face столбцы на xxx jvol столбцы) и переписать результаты inplace ( xxx jvol столбец). Результаты должны быть такими:

          ivol  Front Face  Back Face  Left Face  Right Face  Front jvol  Back jvol  Left jvol  Right jvol  
row col                                                                                                    
99  49   5792          1           1          1          0        5734        5850       5791        0
    50   5793          1           1          0          0        5735        5851        0          0   
    51   5794          1           1          0          0        5736        5852        0          0   
    52   5795          1           1          0          0        5737        5853        0          0  
 

Я могу сделать это с помощью:

 df['Front jvol'] = df['Front Face'] * df['Front jvol']
df['Back jvol'] = df['Back Face'] * df['Back jvol']
df['Left jvol'] = df['Left Face'] * df['Left jvol']
df['Right jvol'] = df['Right Face'] * df['Right jvol']
 

Но это выдает SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead предупреждение, и я не согласен его использовать.

Ответ №1:

Попробуйте с dataframe.assign

 df.assign(
    front_jvol=df['Front Face'] * df['Front jvol'],
    back_jvol=df['Back Face'] * df['Back jvol'],
    left_jvol=df['Left Face'] * df['Left jvol'],
    right_jvol=df['Right Face'] * df['Right jvol']
)
 

Комментарии:

1. Это решение создает новые столбцы (fron_jvol и т. Д.). Как я могу сохранить их в существующих столбцах (Front jvol и т. Д.)?

2. он возвращает новый объект dataframe со всеми исходными столбцами в дополнение к новым, просто переназначите их на существующие df

3. Проницательное предложение.

Ответ №2:

Вы можете использовать понимание словаря, поскольку ваши столбцы имеют общие префиксы:

 columns = ["Front", "Back", "Left", "Right"]

mapping = {f"{col} jvol":  df[f"{col} Face"] * df[f"{col} jvol"] 
            for col in columns}
 

Конечный результат:

 df.assign(**mapping)