#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)