【问题标题】:merging data frames in pandas合并熊猫中的数据框
【发布时间】:2014-07-02 14:53:12
【问题描述】:

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 !!!

【问题讨论】:

  • 我没有看到您要合并的数据。第一次合并有效,但不包含任何合并数据...
  • 问候,谢谢你的回复,我的问题是第二个"pd.merge(left,right,left_index=True,right_index=True,left_on='key1')" 它抛出错误我只想知道为什么它不会发生在第一个(pd.merge(left,right,right_index=True,left_index=True,right_on='event1'))

标签: python pandas merge


【解决方案1】:

您遇到了一些问题。首先,您的合并语句构造不正确。您不应该同时使用left_onleft_indexright_onright_index。您应该只使用一个左选项和一个右选项。

第二条语句出错的原因是索引级别不匹配。在您的左合并中,左索引是一个级别,当您同时指定 right_index=Trueright_on='event1' 时,right_on 属性优先。由于两者都是单级整数,所以没有问题。我应该指出,如果构造正确,合并 (pd.merge(left, right, left_index=True, right_on='event1', how='left')) 不会产生空 DataFrame...请参见下面的代码。

在您的右合并中,您指定使用右索引与right_index=Trueleft_on 优先于left_index=True。这里的问题是正确的索引是 2 级,而您的 '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

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2017-09-02
    • 2018-02-02
    • 2017-06-11
    • 2016-01-01
    相关资源
    最近更新 更多