Python Pandas仅合并某些列


109

是否可以仅合并一些列?我有一个带有x,y,z和df2列的DataFrame df1,其中x,a,b,c,d,e,f等列。

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

结果将是具有x,y,z,a,b的DataFrame。

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


1
安迪:真牛,这很容易...我需要休息一下,我显然使这太复杂了。感谢您的澄清!
BubbleGuppies

Answers:


81

您可以合并sub-DataFrame(仅包含那些列):

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

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

6
嗯,我想知道是否应该有一种本机的方法,例如dropna中的子集...将放在一起github问题
Andy Hayden

嗯...我试图用它来合并从df2到df1的列'Unique_External_Users',但出现了一个错误...“没有[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]“中。
CoolDocMan

这是代码。... df1.merge(df2('Unique_External_Users')])
CoolDocMan

1
@CoolDocMan我认为您错过了建议的答案:list('xab')接受字符串'xab'的每个元素(字母)并将其转换为列表元素,然后list('xab')返回['x', 'a', 'b']。如果每列都有一个字母作为名称,则该方法有效。在您的情况下,我认为您需要执行df1.merge(df2 ['Unique_External_Users'],* other_arguments)。...最有可能你已经解决了它现在,就要离开这个新手身边,和我一样
SOf_PUAR

114

您想使用两个括号,因此,如果要执行VLOOKUP动作,请执行以下操作:

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

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


11

如果要从目标数据框中删除列,但联接需要该列,则可以执行以下操作:

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

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


4
如果尝试此操作,则会出现以下错误:KeyError: "['key1'] not found in axis"
Tanya Branagan

3
试试.drop(columns = ['key1'])
psangam

或.drop('key1',axis = 1)
tonneofash

8

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

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

在此示例中,您要合并dataframe1和dataframe2。您已选择对“键”进行外部左连接。但是,对于dataframe2,您指定.iloc了允许您以数字格式指定想要的行和列的方法。使用:,选择所有行,但[0:5]选择前5列。您可以使用.loc按名称指定,但是如果您使用长列名称,则.iloc可能会更好。


1
当心.loc将要复制,并且在大df上可能会很痛苦。最好合并然后立即在同一表达式中获取一个列切片。
smci

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.