Pandas数据框多索引合并

2024-04-19 08:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一个关于在pandas中合并多索引数据帧的问题,下面是一个假设的场景:

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
            ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index1 = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
index2 = pd.MultiIndex.from_tuples(tuples, names=['third', 'fourth'])

s1 = pd.DataFrame(np.random.randn(8), index=index1, columns=['s1'])
s2 = pd.DataFrame(np.random.randn(8), index=index2, columns=['s2'])

那么要么

s1.merge(s2, how='left', left_index=True, right_index=True)

或者

s1.merge(s2, how='left', left_on=['first', 'second'], right_on=['third', 'fourth'])

会导致错误。

是否必须对s1/s2执行reset_index()才能使此工作?

谢谢


Tags: indexfoobarbazleftonepdtwo
3条回答

好像你需要用它们的组合。

s1.merge(s2, left_index=True, right_on=['third', 'fourth'])
#s1.merge(s2, right_index=True, left_on=['first', 'second'])

输出:

               s1        s2
bar one  0.765385 -0.365508
    two  1.462860  0.751862
baz one  0.304163  0.761663
    two -0.816658 -1.810634
foo one  1.891434  1.450081
    two  0.571294  1.116862
qux one  1.056516 -0.052927
    two -0.574916 -1.197596

除了使用@ALollz所指的索引名之外,您只需使用loc,它将自动匹配索引

s1.loc[:, 's2'] = s2   # Or explicitly, s2['s2']

                s1           s2
first   second      
bar     one     -0.111384   -2.341803
        two     -1.226569    1.308240
baz     one      1.880835    0.697946
        two     -0.008979   -0.247896
foo     one      0.103864   -1.039990
        two      0.836931    0.000811
qux     one     -0.859005   -1.199615
        two     -0.321341   -1.098691

一般公式是

s1.loc[:, s2.columns] = s2

rename_axis

您可以重命名一个的索引级别并让join执行它的操作

s1.join(s2.rename_axis(s1.index.names))

                    s1        s2
first second                    
bar   one    -0.696420 -1.040463
      two     0.640891  1.483262
baz   one     1.598837  0.097424
      two     0.003994 -0.948419
foo   one    -0.717401  1.190019
      two    -1.201237 -0.000738
qux   one     0.559684 -0.505640
      two     1.979700  0.186013

concat

pd.concat([s1, s2], axis=1)

                    s1        s2
first second                    
bar   one    -0.696420 -1.040463
      two     0.640891  1.483262
baz   one     1.598837  0.097424
      two     0.003994 -0.948419
foo   one    -0.717401  1.190019
      two    -1.201237 -0.000738
qux   one     0.559684 -0.505640
      two     1.979700  0.186013

相关问题 更多 >