#pandas
#pandas
Вопрос:
У меня есть два фрейма данных.
Один из них содержит: item id
, name
, quantity
и price
. Другой: item id
, name
и quantity
.
Проблема заключается в обновлении имен и количества в первом фрейме данных, берущем информацию из второго фрейма данных по идентификатору элемента. Кроме того, первый фрейм данных содержит не все идентификаторы элементов, поэтому мне нужно учитывать только те строки из второго фрейма данных, которые находятся в первом.
Фрейм данных 1
In [1]: df1
Out[1]:
id name quantity price
0 10 X 10 15
1 11 Y 30 20
2 12 Z 20 15
3 13 X 15 10
4 14 X 12 15
Фрейм данных 2
In [2]: df2
Out[2]:
id name quantity
0 10 A 3
1 12 B 3
2 13 C 6
Я пытался использовать apply
для перебора строк и изменения значения столбца по условию следующим образом:
def modify(row):
row['name'] = df2[df2['id'] == row['id']]['name'].get_values()[0]
row['quantity'] = df2[df2['id'] == row['id']]['quantity'].get_values()[0]
df1.apply(modify, axis=1)
Но это не дает никаких результатов. Фрейм данных 1 остается тем же
Сначала я ожидаю чего-то подобного:
In [1]: df1
Out[1]:
id name quantity price
0 10 A 3 15
1 11 Y 30 20
2 12 B 3 15
3 13 C 6 10
4 14 X 12 15
После этого я хочу удалить строки, которые не были изменены, чтобы получить:
In [1]: df1
Out[1]:
id name quantity price
0 10 A 3 15
1 12 B 3 15
2 13 C 6 10
Ответ №1:
Использование update
df1=df1.set_index('id')
df1.update(df2.set_index('id'))
df1=df1.reset_index()
Out[740]:
id name quantity price
0 10 A 3.0 15
1 11 Y 30.0 20
2 12 B 3.0 15
3 13 C 6.0 10
4 14 X 12.0 15
Комментарии:
1. Большое спасибо! Работал отлично
Ответ №2:
new_df = df.merge(df2, on='id')
new.drop(['name_x','quantity_x'], inplace=True, axis=1)
new.columns = ['id','price','name','quantity']
Вывод
id price name quantity
0 10 15 A 3
1 12 15 B 3
2 13 10 C 6