Python Pandas仅合并某些列

joe*_*otz 86 python merge pandas

是否可以只合并一些列?我有一个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.

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

Art*_*and 76

您想使用两个括号,因此如果您正在执行VLOOKUP操作:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')
Run Code Online (Sandbox Code Playgroud)

这将为您提供原始df中的所有内容+添加您想要加入的df2中的一个对应列.

  • @Gathide是的,可以有多个目标列,例如`df2[['key','target1','target2']]` (4认同)
  • 我相信这应该是公认的答案。@BubbleGuppies (3认同)
  • `Target_Column` 可以是列列表吗? (2认同)

And*_*den 71

您可以合并子DataFrame(仅包含这些列):

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

df1.merge(df2[list('xab')])
Run Code Online (Sandbox Code Playgroud)

  • 嗯,我想知道是否应该有一种原生方式来做这件事,比如dropna中的子集...将把github问题放在一起 (6认同)
  • @CoolDocMan我认为你错过了建议的答案中的一些内容:`list('xab')`获取字符串'xab'的每个元素(字母)并将其转换为列表元素,因此`list('xab')`返回` ['x', 'a', 'b']`。如果每列都有一个字母作为名称,则该方法有效。在你的情况下,我认为你需要做 df1.merge(df2['Unique_External_Users'], *other_arguments)。...很可能你现在已经解决了这个问题,把这个留给像我这样的新手 (5认同)

小智 28

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

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

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

  • 如果我尝试这样做,我会收到以下错误:`KeyError:“['key1']在轴中找不到”` (6认同)
  • 尝试 .drop(columns= ['key1']) (4认同)
  • 或更短: `.drop('key1', 1)` (2认同)

小智 8

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

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

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

  • 请注意,[`.loc`将制作副本](/sf/ask/1630739771/),并且在较大的 df 上可能会很痛苦。合并然后立即在同一表达式中获取列切片可能会更好。 (3认同)

小智 7

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

如果table_1包含t1_a,t1_b,t1_c..,id,..t1_ztable_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)
Run Code Online (Sandbox Code Playgroud)