Допустим, у меня есть pandas фрейм данных, который выглядит как:
df1 = pd.DataFrame({"Item ID":["A", "B", "C", "D", "E"], "Value1":[1, 2, 3, 4, 0],
"Value2":[4, 5, 1, 8, 7], "Value3":[3, 8, 1, 2, 0],"Value4":[4, 5, 7, 9, 4]})
print(df1)
Item_ID Value1 Value2 Value3 Value4
0 A 1 4 3 4
1 B 2 5 8 5
2 C 3 1 1 7
3 D 4 8 2 9
4 E 0 7 0 4
Теперь у меня есть второй фрейм данных, который выглядит как:
df2 = {"Item ID":["A", "C", "D"], "Value5":[4, 5, 7]}
print(df2)
Item_ID Value5
0 A 4
1 C 5
2 D 7
Что я хочу сделать, это найти, где идентификатор элемента совпадает между двумя моими фреймами данных, а затем добавить значения столбца «Value5» к пересечению строк И ТОЛЬКО столбцы Value1 и Value2 из df1 (эти столбцы могут изменять каждую итерацию, поэтому эти столбцы должны содержится в переменной).
Мой вывод должен показать:
- 4 добавлено в строку A, добавлены столбцы «Value1» и «Value2»
- 5 к строке C, столбцы «Value1» и «Value2»
7 добавлены к строке D, столбцы «Value1» и «Value2»
Item_ID Value1 Value2 Value3 Value4
0 A 5 8 3 4
1 B 2 5 8 5
2 C 8 6 1 7
3 D 11 15 2 9
4 E 0 7 0 4
Конечно, мои данные содержат много тысяч строк. Я могу сделать это, используя для l oop, но это занимает слишком много времени. Я хочу иметь возможность векторизовать это каким-то образом. Любые идеи?
Это то, что я закончил делать на основе предложений @ sammywemmy
#Takes columns names and changes them into a list
names = df1.colnames.tolist()
#Merge df1 and df2 based on 'Item_ID'
merged = df1.merge(df2, on='Item_ID', how='outer')
for i in range(len(names)):
#using assign and **, we can bring in variable names with assign.
#Then add our Value 5 column
merged = merged.assign(**{names[i] : lambda x : x[names[i]] + x.Value5})
#Only keep all the columns before and including 'Value4'
df1= merged.loc[:,:'Value4']