在pandas中合并数据框

0 投票
1 回答
3786 浏览
提问于 2025-04-18 06:32

pandas.merge在处理左右两边的数据时表现得不一样!如果我们在左边同时使用left_on和left_index,就会出现错误,但在右边这样做却没问题!!!

代码:

import pandas as pd
import numpy as np
right = pd.DataFrame(data=np.arange(12).reshape((6,2)),index=[['Nevada', 'Nevada', 'Ohio', 'Ohio', 'Ohio', 'Ohio'],[2001, 2000, 2000, 2000, 2001, 2002]],columns=['event1','event2'])
left = pd.DataFrame(data={'key1':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],'key2':[2000, 2001, 2002, 2001, 2002],'data':np.arange(5.)})
pd.merge(left,right,right_index=True,left_index=True,right_on='event1')#it works and returns an empty table which is expected
pd.merge(left,right,left_index=True,right_index=True,left_on='key1')# it makes error !!!

1 个回答

2

你遇到了一些问题。首先,你的合并语句写得不太对。你不应该同时使用 left_onleft_index,或者 right_onright_index。你应该只选择一个左边的选项和一个右边的选项。

你在第二个语句中出现错误的原因是因为索引的层级不匹配。在你的左合并中,左边的索引是单层的,而你同时指定了 right_index=Trueright_on='event1',但 right_on 的设置优先级更高。因为这两个都是单层整数,所以没有问题。我需要指出的是,如果合并写得正确(pd.merge(left, right, left_index=True, right_on='event1', how='left')),是不会产生空的 DataFrame 的……下面的代码可以看看。

在你的右合并中,你指定使用右边的索引,设置了 right_index=True,而 left_on 的优先级高于 left_index=True。这里的问题是右边的索引有两个层级,而你的 'key1' 字段只有一个层级的字符串。

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: right = pd.DataFrame(data=np.arange(12).reshape((6,2)),index=[['Nevada', 'Nevada', 'Ohio', 'Ohio', 'Ohio', 'Ohio'],[2001, 2000, 2000, 2000, 2001, 2002]],columns=['event1','event2'])

In [4]: left = pd.DataFrame(data={'key1':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],'key2':[2000, 2001, 2002, 2001, 2002],'data':np.arange(5.)})

In [5]: left
Out[5]:
   data    key1  key2
0     0    Ohio  2000
1     1    Ohio  2001
2     2    Ohio  2002
3     3  Nevada  2001
4     4  Nevada  2002

In [6]: right
Out[6]:
             event1  event2
Nevada 2001       0       1
       2000       2       3
Ohio   2000       4       5
       2000       6       7
       2001       8       9
       2002      10      11

In [5]: left_merge = left.merge(right, left_index=True, right_on='event1', how='left')

In [7]: left_merge
Out[7]:
             data    key1  key2  event1  event2
Nevada 2001     0    Ohio  2000       0       1
Ohio   2002     1    Ohio  2001       1     NaN
Nevada 2000     2    Ohio  2002       2       3
Ohio   2002     3  Nevada  2001       3     NaN
       2000     4  Nevada  2002       4       5

撰写回答