python - 多索引合并返回空 df 但连接应该有效

标签 python pandas dataframe merge

我正在尝试加入两个数据框,其中分别包括按国家代码和年份列出的奥运会奖牌总数以及按国家代码和年份列出的国家人口。每个都是具有相同多索引(国家、人口)的一列数据框。

数据框不一定包含相同的国家和年份,例如奥运会年份没有一般年份那么多,并且人口估计数据集中缺少一些国家代码。一些摘录来说明 ITA 和部分重叠的一些年份的数据结构:

医学:

          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 和 Year 索引的组合(这将是我使用此内部联接的目标)。

根据我之前发布的两个数据子集,预期输出应如下所示:

          Medals  Population
Cty Year        
ITA 1960      88  50199700.0
    1964      50  51675350.0

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

最佳答案

事实证明,问题不在于我的合并或连接语法,而在于多索引中一个数据帧将年份存储为 str,另一个数据帧存储为 int64。

我使用以下代码将 str 1 转换为 int64,合并运算符随后按预期工作:

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

我发布此内容作为我自己帖子的答案的唯一原因是为了证明该评论,我感谢 root 的提示,以防其他人遇到类似问题。

关于python - 多索引合并返回空 df 但连接应该有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48917052/

相关文章:

python - 用递归找出一对中的目标差异

python - Pandas groupby对象的聚合

python - Pandas :将 int64 年转换为仅显示年份的日期时间

python - 将 Dataframe 转换为包含 Pandas 数组的单元格的 Series

c - 将数据帧从 C 返回到 R -

python - Pandas 合并或加入较小的数据框

python - 正则表达式:如何匹配两个字符但排除某个组合

python - Docker 中的 Elasticsearch : elasticsearch. 异常。ConnectionError:ConnectionError - Python

python - Django - 捕获异常

python - 使用子图绘制 pandas 数据框时出现 IndexError