从python pandas中的两个数据框中连接选定的列

时间:2019-01-02 02:40:50

标签: python pandas dataframe

我正在尝试将python熊猫的数据框中的某些列连接起来。说,我有以下数据帧:

  

df1 ['头','身体','feat1','feat2']

     

df2 ['Head','Body','feat3','feat4']

我想将数据框合并到:

  

merged_df ['Head','Body','feat1','feat2','feat3',feat4']

直觉上,我这样做:

merged_df = pd.concat([df1, df2['feat3','feat4'],axis=1)

它没有用。我做了研究,然后这样做:

merged_df = 
df1[['Head','Body','feat1','feat2']].merge(df2[['Head','feat3','feat4']], 
on='Head', how='left')

它有效,但是导致我的数据存在一些差异。原来我的一些“头”数据不是唯一的。因此,现在我正在寻找最直接的方法来将DF2中的选定列连接到我的DF1中。请注意,两个数据帧遵循相同的顺序,因此DF1中的第1行与DF2中的第1行直接相关,第8120行也是如此,依此类推。

谢谢

2 个答案:

答案 0 :(得分:0)

我认为您需要赋值,它将忽略索引

df1['feat3']=df2['feat3'].values
df1['feat4']=df2['feat4'].values

答案 1 :(得分:0)

以一个示例为例,假设我们有两个DataFrame,分别为df1df2,因此,如果列中的值相同或唯一,则只需合并即可对齐列如您所愿。

$ df1
   Head  Body  feat1  feat2
0     1     1      1      1
1     2     2      2      2
2     3     3      3      3


$ df2
   Head  Body  feat3  feat4
0     1     1      1      1
1     2     2      2      2
2     3     3      3      3

第1步解决方案:

>>> pd.merge(df1, df2, on=['Head',  'Body'])
   Head  Body  feat1  feat2  feat3  feat4
0     1     1      1      1      1      1
1     2     2      2      2      2      2
2     3     3      3      3      3      3

其次,如果您的列值不同,则可以使用pd.concat或pd.merge:

$ df1
   Head  Body  feat1  feat2
0     1     1      1      1
1     2     2      2      2
2     3     3      3      3

$ df2
   Head  Body  feat3  feat4
0     4     1      1      1
1     5     2      2      2
2     6     3      3      3

第2步解决方案:

如果您想同时使用两个框架中的键并集,则可以同时使用concatmerge,如下所示:

>>> pd.concat([df1,df2], join="outer", sort=False)
   Head  Body  feat1  feat2  feat3  feat4
0     1     1    1.0    1.0    NaN    NaN
1     2     2    2.0    2.0    NaN    NaN
2     3     3    3.0    3.0    NaN    NaN
0     4     1    NaN    NaN    1.0    1.0
1     5     2    NaN    NaN    2.0    2.0
2     6     3    NaN    NaN    3.0    3.0


>>> pd.merge(df1, df2, on=['Head',  'Body'], how='outer')
   Head  Body  feat1  feat2  feat3  feat4
0     1     1    1.0    1.0    NaN    NaN
1     2     2    2.0    2.0    NaN    NaN
2     3     3    3.0    3.0    NaN    NaN
3     4     1    NaN    NaN    1.0    1.0
4     5     2    NaN    NaN    2.0    2.0
5     6     3    NaN    NaN    3.0    3.0

或者您可以选择拥有:

a)如果您想使用左框中的键

pd.merge(df1, df2, on=['Head',  'Body'], how='left')

b)如果要使用右框的键

pd.merge(df1, df2, on=['Head',  'Body'], how='right')

默认为“内部”。

  

内部:使用两个框架中关键点的交集,类似于SQL   内部联接;保留左键的顺序

您可以看到DataFrame.merge的详细信息。

查看解决方法后,您想使用left frame

中的密钥
>>> pd.merge(df1, df2, on=['Head',  'Body'], how='left')
   Head  Body  feat1  feat2  feat3  feat4
0     1     1      1      1    NaN    NaN
1     2     2      2      2    NaN    NaN
2     3     3      3      3    NaN    NaN