【问题标题】:Python Pandas merge only certain columnsPython Pandas 仅合并某些列
【发布时间】:2013-08-01 10:28:06
【问题描述】:

是否可以只合并某些列?我有一个 DataFrame df1,其中包含 x、y、z 列和 df2,其中包含 x、a、b、c、d、e、f 等列。

我想合并 x 上的两个 DataFrame,但我只想合并 df2.a、df2.b 列 - 而不是整个 DataFrame。

结果将是一个包含 x、y、z、a、b 的 DataFrame。

我可以合并然后删除不需要的列,但似乎有更好的方法。

【问题讨论】:

  • 安迪:天哪,这很容易……我需要休息一下,我显然把这件事弄得太复杂了。感谢您的澄清!

标签: python merge pandas


【解决方案1】:

您想使用两个括号,所以如果您正在执行 VLOOKUP 类型的操作:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

这将为您提供原始 df 中的所有内容 + 在 df2 中添加您要加入的相应列。

【讨论】:

  • Target_Column 可以是列列表吗?
  • 我相信这应该是公认的答案。 @BubbleGuppies
  • @Gathide 是的,可以有多个目标列,如df2[['key','target1','target2']]
【解决方案2】:

您可以合并子数据帧(仅包含这些列):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])

【讨论】:

  • 嗯,我想知道是否应该有一种本地方式来做到这一点,比如 dropna 中的子集......将放在一起 github 问题
  • 嗯...我尝试使用它来将列 'Unique_External_Users' 从 df2 合并到 df1 但出现错误...“[Index(['U', 'n', 'i '、'q'、'u'、'e'、''、'E'、'x'、't'、'e'、'r'、'n'、'a'、\n 'l', '', 'U', 's', 'e', 'r', 's'],\n dtype='object')] 在 [columns]" 中。
  • 这里是代码。 ... df1.merge(df2('Unique_External_Users')])
  • @CoolDocMan 我认为您在建议的答案中遗漏了一些东西:list('xab') 获取字符串 'xab' 的每个元素(字母)并将其转换为列表元素,因此 list('xab') 返回 ['x', 'a', 'b'] .如果每列都有一个字母作为名称,则此方法有效。在您的情况下,我认为您需要执行 df1.merge(df2['Unique_External_Users'], *other_arguments)。 ...很可能你现在已经解决了,只是把它留给像我这样的新手
【解决方案3】:

如果您想从目标数据框中删除列,但连接需要这些列,您可以执行以下操作:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop(columns = ['key1'])

.drop(columns = 'key1') 部分将阻止“key1”保留在结果数据框中,尽管它首先需要加入。

【讨论】:

  • 如果我尝试这个,我会收到以下错误:KeyError: "['key1'] not found in axis"
  • 试试 .drop(columns= ['key1'])
  • 或 .drop('key1', axis = 1)
  • 或更短:.drop('key1', 1)
【解决方案4】:

您可以使用.loc 选择包含所有行的特定列,然后将其拉出。下面是一个例子:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

在本例中,您将合并 dataframe1 和 dataframe2。您已选择在“键”上进行外部左连接。但是,对于 dataframe2,您已指定 .iloc,它允许您以数字格式指定所需的行和列。使用:,您选择所有行,但[0:5] 选择前5 列。您可以使用.loc 按名称指定,但如果您处理长列名,那么.iloc 可能会更好。

【讨论】:

  • 当心.loc will make a copy,以及可能会很痛苦的大df。合并然后立即在同一表达式中获取列切片可能会更好。
【解决方案5】:

这是从两个表中合并选定的列。

如果table_1 包含t1_a,t1_b,t1_c..,id,..t1_z 列, table_2 包含 t2_a, t2_b, t2_c..., id,..t2_z 列, 而决赛桌只需要t1_a、id、t2_a,那么

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)

【讨论】:

    【解决方案6】:

    对多字符列名的接受答案略有扩展,默认使用内连接:

    df1 = df1.merge(df2[["Key_Column", "Target_Column1", "Target_Column2"]])
    

    这假设 Key_Column 是两个数据框共有的唯一列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2020-12-12
      相关资源
      最近更新 更多