Pandas Multiindex DataFrame Конкатенация условных столбцов - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть 2 мультииндексных фрейма данных

df2 = pd.DataFrame({'Country': [ 'US', 'IT', 'FR'],
                'Unit': [ 'USD', 'EUR', 'EUR'],
                  'Location': [ 'Hawai', 'Torino', 'Paris'],
                  '2000': [666, 888,777],
                    '2002': [44,55,66]
                   })
df2.set_index(['Country','Unit','Location'],inplace=True)

df3 = pd.DataFrame({'Country': [ 'US', 'IT', 'FR'],
                'Unit': [ 'USD', 'EUR', 'EUR'],
                  '2018': [666, 888,777]
                   })
df3.set_index(['Country','Unit'],inplace=True)  
                       2000  2002
Country Unit Location            
US      USD  Hawai      666    44
IT      EUR  Torino     888    55
FR      EUR  Paris      777    66
              2018
Country Unit      
US      USD    666
IT      EUR    888
FR      EUR    777  

Я хотел бы получить результат фрейма данных со столбцом thid со значениями только для EUR, другой должен оставаться пустым, как показано ниже

                      2000  2002 2018
Country Unit Location                 
US      USD  Hawai      666    44     
IT      EUR  Torino     888    55  888
FR      EUR  Paris      777    66  777  

Пробовал объединение, но не уверен, что это правильный подход?Есть идеи?

1 Ответ

0 голосов
/ 23 февраля 2019

Используйте join с DataFrame.xs для выбора вторым уровнем MultiIndex:

df = df2.join(df3.xs('EUR', level=1, drop_level=False))
print (df)
                       2000  2002   2018
Country Unit Location                   
US      USD  Hawai      666    44    NaN
IT      EUR  Torino     888    55  888.0
FR      EUR  Paris      777    66  777.0

Деталь:

print (df3.xs('EUR', level=1, drop_level=False))
              2018
Country Unit      
IT      EUR    888
FR      EUR    777

Решение, работающее в pandas 0.22.0 - конвертировать 3. уровень MultiIndex в столбец для одинакового количества уровней в обоих DataFrame с на reset_index, join и последний set_index с append=True во избежание падения оригинальных значений индекса:

df = (df2.reset_index(level=2)
         .join(df3.xs('EUR', level=1, drop_level=False))
         .set_index('Location', append=True))
print (df)
                       2000  2002   2018
Country Unit Location                   
US      USD  Hawai      666    44    NaN
IT      EUR  Torino     888    55  888.0
FR      EUR  Paris      777    66  777.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...