合并pandas中的数据帧

时间:2016-06-06 19:07:32

标签: pandas dataframe merge

我是熊猫新手,我面临以下问题:

我有2个数据框:

df1:

x  y
1  3 4
2  nan
3  6
4  nan
5  9 2
6  1 4 9

DF2:

x  y
1  2 3 6 1 5
2  4 1 8 7 5
3  6 3 1 4 5
4  2 1 3 5 4  
5  9 2 3 8 7
6  1 4 5 3 7

两者的大小相同。

我想合并两个数据帧,以便得到的所有结果数据帧如下:

结果:

x  y
1  3 4 6 1 5
2  4 1 8 7 5
3  6 3 1 4 5
4  2 1 3 5 4
5  9 2 3 8 7
6  1 4 5 6 7

因此在结果中,优先考虑df2。如果df2中有一个值,则将其放在第一位,其余值从df1开始(它们与df1中的位置相同)。结果中应该没有重复的值(即如果一个值在df1中的位置1和df2中的位置3,那么该值应仅出现在结果中的位置1而不重复)

任何形式的帮助将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

IIUC

设置

df1 = pd.DataFrame(dict(x=range(1, 7),
                        y=[[3, 4], None, [6], None, [9, 2], [1, 4, 9]]))
df2 = pd.DataFrame(dict(x=range(1, 7), y=[[2, 3, 6, 1, 5], [4, 1, 8, 7, 5],
                                          [6, 3, 1, 4, 5], [2, 1, 3, 5, 4],
                                          [9, 2, 3, 8, 7], [1, 4, 5, 3, 7]]))


print df1
print
print df2

   x          y
0  1     [3, 4]
1  2       None
2  3        [6]
3  4       None
4  5     [9, 2]
5  6  [1, 4, 9]

   x                y
0  1  [2, 3, 6, 1, 5]
1  2  [4, 1, 8, 7, 5]
2  3  [6, 3, 1, 4, 5]
3  4  [2, 1, 3, 5, 4]
4  5  [9, 2, 3, 8, 7]
5  6  [1, 4, 5, 3, 7]

转换为更有用的东西:

df1_ = df1.set_index('x').y.apply(pd.Series)
df2_ = df2.set_index('x').y.apply(pd.Series)

print df1_
print
print df2_

     0    1    2
x               
1  3.0  4.0  NaN
2  NaN  NaN  NaN
3  6.0  NaN  NaN
4  NaN  NaN  NaN
5  9.0  2.0  NaN
6  1.0  4.0  9.0

   0  1  2  3  4
x               
1  2  3  6  1  5
2  4  1  8  7  5
3  6  3  1  4  5
4  2  1  3  5  4
5  9  2  3  8  7
6  1  4  5  3  7

优先考虑df1(我认为你的意思是df1,因为这与我对你的问题的解释和你提供的预期输出一致)然后减少以消除重复:

print df1_.combine_first(df2_).apply(lambda x: x.unique(), axis=1)

   0  1  2  3  4
x               
1  3  4  6  1  5
2  4  1  8  7  5
3  6  3  1  4  5
4  2  1  3  5  4
5  9  2  3  8  7
6  1  4  9  3  7