ИНДЕКСИРУЙТЕ и СОПОСТАВЛЯЙТЕ с несколькими критериями в Pandas Python

#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