多索引数据帧条件列合并

2024-09-29 02:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个多索引数据帧

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列的值只有欧元,其他应保持空白,如下所示

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

尝试了串联,但不确定这是正确的方法?有什么想法吗?你知道吗


Tags: 数据dataframeunititlocationfreurcountry
1条回答
网友
1楼 · 发布于 2024-09-29 02:19:45

使用^{}^{}作为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中工作的解决方案。多索引到列的级别,在DataFrames by ^{}join和last ^{}中具有相同的级别数,以避免删除原始索引值:

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

相关问题 更多 >