Python 在第二级索引上高效地组合数据帧
我有两个数据帧看起来像Python 在第二级索引上高效地组合数据帧,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我有两个数据帧看起来像 将熊猫作为pd导入 df1=局部数据帧([2.1,4.2,6.3,8.4,10.5],索引=[2,4,6,8,10]) df1.index.name='t' df2=pd.DataFrame(index=pd.MultiIndex.from_元组([('A','A',1),('A','A',4), ('A','b',5),('A','b',6),('b','c',7), ('B','c',9),('B','d',10),('B','d',11), ],name=('big
将熊猫作为pd导入
df1=局部数据帧([2.1,4.2,6.3,8.4,10.5],索引=[2,4,6,8,10])
df1.index.name='t'
df2=pd.DataFrame(index=pd.MultiIndex.from_元组([('A','A',1),('A','A',4),
('A','b',5),('A','b',6),('b','c',7),
('B','c',9),('B','d',10),('B','d',11),
],name=('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
也就是说,我想把df2
的0
和1
索引级别作为df1
中的0
和1
索引级别
当然,数据帧上的循环也可以工作,但对于大型数据帧来说并不可行
编辑:
从下面的评论看来,我应该添加,索引
big
和small
应该根据t
的顺序推断df1
中的t
尝试提取级别值并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)
)
尝试提取级别值并重新索引
:
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)
)
假设您希望根据't'
的顺序推断未知索引级别,我们可以使用其他合并,对值进行排序,然后使用ffill
逻辑重新创建多索引(需要一系列)
假设您希望根据't'
的顺序推断未知索引级别,我们可以使用其他合并,对值进行排序,然后使用ffill
逻辑重新创建多索引(需要一系列)
谢谢你的及时回复!不幸的是,这并不完全是我想要的,因为它从df1
中删除了在df2
中没有索引的行。你怎么知道8
在(B,c)
下,而不是在(A,A)
下?或者2
位于(A,A)
下,但不是(B,d)
?因为t
索引列的顺序。感谢您的立即回复!不幸的是,这并不完全是我想要的,因为它从df1
中删除了在df2
中没有索引的行。你怎么知道8
在(B,c)
下,而不是在(A,A)
下?或者2
位于(A,A)
下,但不是(B,d)
?因为t
索引列的顺序。