MultiIndex合并返回空的DF,但加入应该有效



我正在尝试加入两个数据框架,这些数据范围分别包括按国家代码按国家代码以及按国家代码和年份按年份和国家人口按国家代码和国家人口进行的全面奖章。每个都是一列的数据框,具有相同的多索引(国家,人口(。

数据范围可能不一定包括同一国家和几年,例如奥林匹克年份不如一般年份,而人口估算数据集则缺少某些国家/地区代码。几个提取物来说明数据架构,用于ITA和一系列部分重叠的几年:

med:

          Medals
Cty Year        
ITA 1960      88
    1964      50
    1968      32
    1972      25
    1976      31

流行:

          Population
Cty Year            
ITA 1960  50199700.0
    1961  50536350.0
    1962  50879450.0
    1963  51252000.0
    1964  51675350.0

当我使用此命令时,我会得到一个空数据框。

[In] df = pd.merge(med, pop, left_index=True, right_index=True)
[In] df
[Out] Empty DataFrame
Columns: [Medals, Population]
Index: []

我还尝试了每个数据框架上的reset_index,然后传递此信息:

[In] df = pd.merge(med, pop, on=['Cty','Year'])
[In] df
[Out] Empty DataFrame
Columns: [Cty, Year, Population, Medals]
Index: []

它似乎已经创建了具有预期列名称的数据框,但是由于某种原因,它甚至没有合并两者中存在的CTY和年份索引的组合(这是我的内在加入的目标(。

基于我之前发布的两个数据子集,预期的输出应该看起来像:

          Medals  Population
Cty Year        
ITA 1960      88  50199700.0
    1964      50  51675350.0

我已经彻底搜索了这个网站和其他网站,但我无法缠绕它!任何帮助将不胜感激!

事实证明,这个问题不是我的语法合并或concat,而是一个事实,一个事实是,在多索引中,一个dataframe将一年存储为str,另一个是int64。p>我使用以下代码将str One纳入INT64,此后合并操作员按预期工作:

pop.index = pop.index.set_levels([pop.index.levels[0], pop.index.levels[1].astype(int)])

我将其发布为我自己帖子的答案的唯一原因是证明评论,如果其他人有类似的问题,我要感谢Root的提示。

看起来您需要内部合并:

import pandas as pd
med = pd.DataFrame([['ITA', 1960, 88],    
                    ['ITA', 1964, 50],
                    ['ITA', 1968, 32],
                    ['ITA', 1972, 25],
                    ['ITA', 1976, 31]],
                   columns=['Cty', 'Year', 'Medals'])
pop = pd.DataFrame([['ITA', 1960, 50199700],    
                    ['ITA', 1961, 50536350],
                    ['ITA', 1962, 50879450],
                    ['ITA', 1963, 51252000],
                    ['ITA', 1964, 51675350]],
                   columns=['Cty', 'Year', 'Population'])
med = med.set_index(['Cty', 'Year'])
pop = pop.set_index(['Cty', 'Year'])
pd.merge(med, pop, how='inner', left_index=True, right_index=True)
#           Medals  Population
# Cty Year                    
# ITA 1960      88    50199700
#     1964      50    51675350

jpp

的数据
pd.concat([pop,med],1).dropna()
Out[1496]: 
          Population  Medals
Cty Year                    
ITA 1960  50199700.0    88.0
    1964  51675350.0    50.0

或只是在concat

内设置inner
pd.concat([pop,med],axis=1, join='inner')
Out[1497]: 
          Population  Medals
Cty Year                    
ITA 1960    50199700      88
    1964    51675350      50

最新更新