我想将数据框附加到另一个数据框,即使它们的大小不同

时间:2017-10-10 18:37:31

标签: python pandas dataframe

我对两个数据帧的合并有疑问。 我有一个数据帧,看起来像这样

>> print(df)
     no  value1  value2
0    a     0    -1
1    b    -1     1
2    c    -1     1
3    d     0    -1
4    e    -1    -1

现在我有一个额外的数据框,看起来像这样

>> print(df2)
     no  value3  value4
0    a     1    -1
1    b     1    -1
2    e     1    -1

我想附加列" value3"和" value4"第二个数据帧到第一个数据帧,但只有在它们具有匹配值的情况下才会出现#34; no"柱。 所以最后我希望有一个最终的数据框,如下所示:

>> print(df)
     no  value1  value2  value3  value4
0    a     0      -1      1       -1
1    b    -1       1      1       -1
2    c    -1       1     NaN      NaN
3    d     0      -1     NaN      NaN
4    e    -1      -1      1       -1

有一个简单的解决方案吗?谢谢你的帮助!

4 个答案:

答案 0 :(得分:6)

pd.concatset_index一起使用,让Pandas使用内部数据对齐。

pd.concat([df.set_index('no'),df2.set_index('no')], axis=1).reset_index()

输出:

  index  value1  value2  value3  value4
0     a       0      -1     1.0    -1.0
1     b      -1       1     1.0    -1.0
2     c      -1       1     NaN     NaN
3     d       0      -1     NaN     NaN
4     e      -1      -1     1.0    -1.0

答案 1 :(得分:3)

use merge

pd.merge(df, df2, on=['no'], how='outer')

  no  value1  value2  value3  value4
0  a       0      -1     1.0    -1.0
1  b      -1       1     1.0    -1.0
2  c      -1       1     NaN     NaN
3  d       0      -1     NaN     NaN
4  e      -1      -1     1.0    -1.0

答案 2 :(得分:2)

您正在将列'no'视为索引。如果是这样,您应该考虑将其放在索引中。

<强> pd.DataFrame.merge
@ StevenG的回答是最惯用的,非常简单。问题是pd.DataFrame.merge并不关心索引。它将生成一个具有应有值的新数据帧,但索引与那里没有相似之处。

df.set_index(df.index + 100)

    no  value1  value2
100  a       0      -1
101  b      -1       1
102  c      -1       1
103  d       0      -1
104  e      -1      -1

当我这样做时,我想看到那些相同的索引值

pd.merge(df.set_index(df.index + 100), df2, on=['no'], how='left')

  no  value1  value2  value3  value4
0  a       0      -1     1.0    -1.0
1  b      -1       1     1.0    -1.0
2  c      -1       1     NaN     NaN
3  d       0      -1     NaN     NaN
4  e      -1      -1     1.0    -1.0

但我不

<强> pd.concat
@ ScottBoston也摧毁了该指数。优点在于它将'no'列视为索引。如果它是唯一的,那么它可以提高大型数据帧(未经测试)的性能。

解决方案

<强> pd.DataFrame.join
我建议使用join,因为它旨在处理索引。即使我们没有加入索引,我们也会保留那里的索引。

df.join(df2.set_index('no'), on='no')

  no  value1  value2  value3  value4
0  a       0      -1     1.0    -1.0
1  b      -1       1     1.0    -1.0
2  c      -1       1     NaN     NaN
3  d       0      -1     NaN     NaN
4  e      -1      -1     1.0    -1.0

测试我们是否保护索引

df.set_index(df.index + 100).join(df2.set_index('no'), on='no')

    no  value1  value2  value3  value4
100  a       0      -1     1.0    -1.0
101  b      -1       1     1.0    -1.0
102  c      -1       1     NaN     NaN
103  d       0      -1     NaN     NaN
104  e      -1      -1     1.0    -1.0

我们做到了!

答案 3 :(得分:1)

仅限于娱乐map

df2=df2.set_index('no')
for c in df2.columns:
    df1[c] = df1['no'].map(df2[c]).values


Out[828]: 
  no  value1  value2  value3  value4
0  a       0      -1     1.0    -1.0
1  b      -1       1     1.0    -1.0
2  c      -1       1     NaN     NaN
3  d       0      -1     NaN     NaN
4  e      -1      -1     1.0    -1.0