我有两个数据帧.df1是多索引的:
value
first second
a x 0.471780
y 0.774908
z 0.563634
b x -0.353756
y 0.368062
z -1.721840
Run Code Online (Sandbox Code Playgroud)
和df2:
value
first
a 10
b 20
Run Code Online (Sandbox Code Playgroud)
如何将两个数据框仅与一个多索引合并,在这种情况下是"第一个"索引?期望的输出是:
value1 value2
first second
a x 0.471780 10
y 0.774908 10
z 0.563634 10
b x -0.353756 20
y 0.368062 20
z -1.721840 20
Run Code Online (Sandbox Code Playgroud)
And*_*den 15
你可以使用get_level_values:
firsts = df1.index.get_level_values('first')
df1['value2'] = df2.loc[firsts].values
Run Code Online (Sandbox Code Playgroud)
注意:你几乎在join这里做(除了df1是MultiIndex)...所以可能有一种更简洁的方式来描述这个......
.
在一个例子中(类似于你所拥有的):
df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234],
['a', 'y', 0.451], ['b', 'x', 0.453]],
columns=['first', 'second', 'value1']
).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10],['b', 20]],
columns=['first', 'value']).set_index(['first'])
firsts = df1.index.get_level_values('first')
df1['value2'] = df2.loc[firsts].values
In [5]: df1
Out[5]:
value1 value2
first second
a x 0.123 10
x 0.234 10
y 0.451 10
b x 0.453 20
Run Code Online (Sandbox Code Playgroud)
根据文档,从pandas 0.14开始,您可以简单地加入单索引和多索引数据帧.它将匹配公共索引名称.该how参数按预期工作与'inner'和'outer',但有趣的是它似乎是颠倒的'left'和'right'(可能这是一个错误?).
df1 = pd.DataFrame([['a', 'x', 0.471780], ['a','y', 0.774908], ['a', 'z', 0.563634],
['b', 'x', -0.353756], ['b', 'y', 0.368062], ['b', 'z', -1.721840],
['c', 'x', 1], ['c', 'y', 2], ['c', 'z', 3],
],
columns=['first', 'second', 'value1']
).set_index(['first', 'second'])
df2 = pd.DataFrame([['a', 10], ['b', 20]],
columns=['first', 'value2']).set_index(['first'])
print(df1.join(df2, how='inner'))
value1 value2
first second
a x 0.471780 10
y 0.774908 10
z 0.563634 10
b x -0.353756 20
y 0.368062 20
z -1.721840 20
Run Code Online (Sandbox Code Playgroud)