我有两个数据框看起来像
AWS Console
我正在寻找一种有效的方法来组合它们,以便我得到
import pandas as pd
df1 = pd.DataFrame([2.1,4.2,6.3,8.4,10.5], index=[2,4,6,8,10])
df1.index.name = 't'
df2 = pd.DataFrame(index=pd.MultiIndex.from_tuples([('A','a',1),('A','a',4),
('A','b',5),('A','b',6),('B','c',7),
('B','c',9),('B','d',10),('B','d',11),
], names=('big', 'small', 't')))
即我想获得 0
big small t
A a 1 NaN
2 2.1
4 4.2
b 5 NaN
6 6.3
B c 7 NaN
8 8.4
9 NaN
d 10 10.5
11 NaN
的索引级别 0
和 1
作为 df2
中的索引级别 0
和 1
。
当然,数据帧上的循环也可以工作,尽管对于大型数据帧不可行。
编辑:
从下面的评论看来,我应该添加,索引 df1
和 big
应该根据 small
的顺序在 t
中的 df1
上推断。< /p>
答案 0 :(得分:1)
尝试提取级别值和 reindex
:
df2['0'] = df1.reindex(df2.index.get_level_values('t'))[0].values
输出:
0
big small t
A a 1 NaN
4 4.2
b 5 NaN
6 6.3
B c 7 NaN
9 NaN
d 10 10.5
11 NaN
对于 df1
中的更多列,我们只需 merge
:
(df2.reset_index()
.merge(df1, on='t', how='left')
.set_index(df2.index.names)
)
答案 1 :(得分:1)
假设您希望根据 't'
的顺序推断未知索引级别,我们可以使用其他合并,对值进行排序,然后使用 ffill
逻辑重新创建 MultiIndex (为此需要一个系列)。
res = (df2.reset_index()
.merge(df1, on='t', how='outer')
.set_index(df2.index.names)
.sort_index(level='t'))
res.index = pd.MultiIndex.from_arrays(
[pd.Series(res.index.get_level_values(i)).ffill()
for i in range(res.index.nlevels)],
names=res.index.names)
print(res)
0
big small t
A a 1 NaN
2 2.1
4 4.2
b 5 NaN
6 6.3
B c 7 NaN
8 8.4
9 NaN
d 10 10.5
11 NaN