我正在尝试加入两个数据框架,这些数据范围分别包括按国家代码按国家代码以及按国家代码和年份按年份和国家人口按国家代码和国家人口进行的全面奖章。每个都是一列的数据框,具有相同的多索引(国家,人口(。
数据范围可能不一定包括同一国家和几年,例如奥林匹克年份不如一般年份,而人口估算数据集则缺少某些国家/地区代码。几个提取物来说明数据架构,用于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