Как правильно соединить два DataFrame разного размера?
Eсть два DataFrame:
new_big_df
21571 rows × 64 columns
и
car_new_features
1554 rows × 8 columns
In [114]: new_big_df
Out[114]:
body_type color fuel_type model_date_begin name series ... covid price dataset luxury_tax car_tax equipments_count
0 hatchback black gasoline 2007 130i 1ER ... 1 591500 train 1.0 34980 2
1 cabriolet red gasoline 2007 120i 1ER ... 1 1046500 train 1.0 6552 0
2 hatchback olive gasoline 2004 118i 1ER ... 1 500500 train 1.0 3096 9
3 hatchback mid_blue gasoline 2011 M135i 1ER ... 1 1428700 train 1.0 42240 0
4 hatchback black gasoline 2011 116i 1ER ... 1 599690 train 1.0 3264 8
... ... ... ... ... ... ... ... ... ... ... ... ... ...
21566 sedan black gasoline 2013 520i 5ER ... 0 0 test 1.0 7912 13
21567 allroad black diesel 2013 30d X5 ... 0 0 test 1.0 16932 18
21568 sedan black gasoline 2002 525xi 5ER ... 0 0 test 1.0 12644 6
21569 sedan brown gasoline 2009 528i xDrive 5ER ... 0 0 test 1.0 16660 13
21570 allroad black gasoline 2007 50i X6 ... 0 0 test 1.0 53724 1
[21571 rows x 64 columns]
In [115]: car_new_features
Out[115]:
name weight dimensions_length dimensions_width dimensions_height model_date_begin body_type series
0 M140i 1510 4329 1765 1430 2017 hatchback 1ER
1 118i 1380 4329 1765 1440 2017 hatchback 1ER
2 118i Sport 1380 4329 1765 1440 2017 hatchback 1ER
3 118i Urban 1380 4329 1765 1440 2017 hatchback 1ER
4 118i М Sport 1380 4329 1765 1440 2017 hatchback 1ER
... ... ... ... ... ... ... ... ...
1549 3.2i M 1495 4113 1781 1271 2006 coupe Z4
1550 2.0i 1295 4091 1781 1299 2002 cabriolet Z4
1551 2.5i 1335 4091 1781 1299 2002 cabriolet Z4
1552 3.0i 1365 4091 1781 1299 2002 cabriolet Z4
1553 5.0 1660 4400 1830 1317 2000 cabriolet Z8
[1554 rows x 8 columns]
Мне надо для каждого наблюдения (строки) из большого new_big_df взять из меньшего датасета car_new_features недостающие в new_big_df параметры, при условии, если new_big_df совпадают с car_new_features по следующим признакам (колонкам) одновременно: 'name', 'series', 'model_date_begin', 'body_type'
То есть, должен получиться новый DataFrame, у которого количество наблюдений (строк) такое же, как у большого new_big_df, но для каждого наблюдения нужно расширить теми признаками (колонками), которые есть в малом датасете car_new_features
Такая команда не привела к желаемому результату:
result = new_big_df.merge(car_new_features, how='left', on=['name', 'series', 'model_date_begin', 'body_type'])
Ответы (1 шт):
Проблему невозможно решить пока вы не избавитесь от дубликатов в car_new_features, т.к. одной и той же модели из new_big_df будет соответствовать несколько строк из car_new_features и, объединяя два фрейма, Pandas может только сделать декартово произведение множеств.
Пример дубликатов:
on = ['name', 'series', 'model_date_begin', 'body_type']
In [65]: car_new_features[car_new_features.duplicated(subset=on)].sort_values(on).head(19)
Out[65]:
name weight dimensions_length dimensions_width dimensions_height model_date_begin body_type series
1513 1.9 1295 4025 1692 1288 1996 cabriolet Z3
1514 1.9 1315 4025 1692 1288 1996 cabriolet Z3
1505 1.9 1295 4025 1692 1288 1999 cabriolet Z3
1506 1.9 1315 4025 1692 1288 1999 cabriolet Z3
124 116i 1310 4239 1748 1421 2007 hatchback 1ER
135 116i 1340 4239 1748 1421 2007 hatchback 1ER
137 116i 1365 4239 1748 1421 2007 hatchback 1ER
63 116i 1385 4324 1765 1462 2011 hatchback 1ER
64 116i 1385 4324 1765 1462 2011 hatchback 1ER
47 116i 1305 4324 1765 1462 2012 hatchback 1ER
149 118i 1335 4227 1751 1430 2004 hatchback 1ER
126 118i 1365 4239 1748 1421 2007 hatchback 1ER
136 118i 1350 4239 1748 1421 2007 hatchback 1ER
138 118i 1375 4239 1748 1421 2007 hatchback 1ER
102 118i 1505 4360 1748 1411 2008 cabriolet 1ER
93 118i 1520 4360 1748 1411 2011 cabriolet 1ER
24 118i 1380 4329 1765 1440 2015 hatchback 1ER
30 118i 1395 4329 1765 1440 2015 hatchback 1ER
7 118i 1395 4329 1765 1440 2017 hatchback 1ER
Какой, например, вес должен выбрать Pandas для
{
"name": "116i",
"series": "1ER",
"model_date_begin": 2007,
"body_type": "hatchback"
}
???
Без дубликатов в car_new_features, все работает правильно:
on = ['name', 'series', 'model_date_begin', 'body_type']
result = new_big_df.merge(car_new_features.drop_duplicates(subset=on), how='left', on=on)
результат:
In [71]: new_big_df.shape
Out[71]: (21571, 64)