【问题标题】:pandas: merge (join) two data frames on multiple columnspandas:合并(连接)多列上的两个数据框
【发布时间】:2017-06-08 11:28:31
【问题描述】:

我正在尝试使用两列连接两个 pandas 数据框:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

但出现以下错误:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

知道什么是正确的方法吗?谢谢!

【问题讨论】:

  • left_onright_on 应该是字符串列表,而不是看起来像列表的字符串。
  • 简单的错字:left_on=['A_c1','c2'] 而不是'[A_c1,c2]'。正如@root 所说,它需要一个字符串列表。同样right_on = ['B_c1','c2'].
  • 顺便说一句,将数据框A_df 的列命名为以前缀“A_”开头,并将来自B_df 的列命名为B_... 是一种不好的做法。这是完全没有必要的,而且它使连接、合并、groupbys 等基本操作变得烦人。

标签: python python-3.x pandas join


【解决方案1】:

试试这个

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on : 标签或列表,或类似数组的字段名称加入左侧 数据框。可以是长度为的向量或向量列表 DataFrame 使用特定向量作为连接键而不是 列

right_on : 标签或列表,或类似数组的字段名称加入 在每个 left_on 文档的右 DataFrame 或向量/向量列表中

【讨论】:

  • 如果left_onright_on是相同的ab,我们可以使用on = ['a', 'b']吗?
  • 是的,这是完全有效的。
  • 对于像我这样想知道的人,它将根据left_onright_on的顺序/顺序合并,即left_on的第i元素将与right_oni-th 匹配。如果文档更明确地说明这一点,那就太好了。
  • 请注意,只要连接键具有不同的名称,所有名称都将作为合并表中的列出现。例如,left_on='[A_c1, c2]', right_on='[B_c1, c2]') 将产生三列:A_c1B_c1c2,其中 A_c1B_c1 是相同的列。
【解决方案2】:

这里的问题是,通过使用撇号,您将传递的值设置为字符串,而事实上,正如@Shijo 从文档中所述,该函数需要一个标签或列表,而不是字符串!如果列表包含为左右数据帧传递的每个列的名称,则每个列名称 必须 单独包含在撇号内。有了上面所说的,我们可以理解为什么这是不正确的:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

而这是使用函数的正确方法:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

【讨论】:

    【解决方案3】:

    另一种方法: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 2017-01-20
      • 2020-12-04
      • 2015-10-17
      相关资源
      最近更新 更多