【问题标题】:Concatenating selected columns from two data frames in python pandas在python pandas中连接两个数据框中的选定列
【发布时间】:2019-01-02 14:59:26
【问题描述】:

我正在尝试在 python pandas 中连接我的数据框中的一些列。说,我有以下数据框:

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

df2['头','身体','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 行也是如此……

谢谢

【问题讨论】:

  • 你能创建一个小的数据集和预期的输出吗?
  • df1.merge(df2,on=['Head','Body'],how='left')

标签: python pandas dataframe


【解决方案1】:

举个例子,假设我们有两个 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')

默认为'inner'。

inner:使用来自两个帧的键的交集,类似于 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

【讨论】:

  • 谢谢..这篇文章很有帮助。
  • 欢迎您,顺便问一下是什么让您切换了答案?你想要的输出是什么,这就是你帖子中解释的内容
  • 虽然两者都是正确的.. 你的解释很好。我认为那里的基本熊猫数据框教程错过了这种类型的合并。赞一个!
【解决方案2】:

我认为你需要赋值,它会忽略索引

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

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 2017-04-02
    • 1970-01-01
    • 2018-05-10
    • 2019-10-29
    • 2017-06-08
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多