#python-3.x #pandas #dataframe
Вопрос:
Я пытаюсь выполнить сопоставление индексов в наборе данных 2, но у меня возникли проблемы. Вот пример того, что я пытаюсь сделать. Я хочу заполнить столбцы «a», «b», «c», которые пусты в df, данными df2, где «Машина», «Год» и «Тип заказа».
Первый фрейм данных позволяет назвать его «df».
Machine Year Cost a b c
0 abc 2014 5500 nan nan nan
1 abc 2015 89 nan nan nan
2 abc 2016 600 nan nan nan
3 abc 2017 250 nan nan nan
4 abc 2018 2100 nan nan nan
5 abc 2019 590 nan nan nan
6 dcb 2020 3000 nan nan nan
7 dcb 2021 100 nan nan nan
Второй набор данных называется «df2».
Order Type Machine Year Total Count
0 a abc 2014 1
1 b abc 2014 1
2 c abc 2014 2
4 c dcb 2015 4
3 a abc 2016 3
Конечным результатом является:
Machine Year Cost a b c
0 abc 2014 5500 1 1 2
1 abc 2015 89 nan nan nan
2 abc 2016 600 3 nan nan
3 abc 2017 250 nan nan nan
4 abc 2018 2100 nan nan nan
5 abc 2019 590 1 nan nan
6 dcb 2014 3000 nan nan 4
7 dcb 2015 100 nan nan nan
Заранее спасибо за помощь
Ответ №1:
Подумайте DataFrame.pivot
о том, чтобы изменить df2
форму, чтобы слиться с df1
ней .
final_df = (
df1.reindex(["Machine", "Type", "Cost"], axis=True)
.merge(
df.pivot(
index=["Machine", "Year"],
columns="Order Type",
values="Total Count"
).reset_index(),
on = ["Machine", "Year"]
)
)
Комментарии:
1.
join
сon
набором может быть лучше, так как он позволяет избежать копированияdf2
, а объединение по индексу происходит быстрее, чем слияние:df1[["Machine", "Type", "Cost"]].join(df2.pivot(index=['Machine', 'Year'], columns='Order Type', values='Total Count'), on=['Machine', 'Year'])
2. @HenryEcker, действительно, это еще одна альтернатива. А
merge
также поддерживает объединение индексов и столбцов. Новички в панд путаются с индексами.3. Спасибо! @Parfait