如何将数据帧与熊猫中的冗余行组合在一起



我想将两个具有不同且重叠列的数据框组合在一起:

df1
    X   a   Y   b     c
A   P   1   Q   21    1.135899
B   P   2   Q   22    1.093204
C   P   3   Q   23    2.035373
D   P   4   Q   24    0.350060
E   P   5   Q   25   -0.939962
df2
    a    b     d
A   1    21    5.5
A   1    21    3.3
A   1    21    2.1
B   2    22    0.8
B   2    22    0.5
C   3    23    1.3
C   3    23    6.5
C   3    23    7.1

我想以这种方式组合两个数据框:

df3
    a    b   c          d
A   1    21  1.135899   5.5
A   1    21  1.135899   3.3
A   1    21  1.135899   2.1
B   2    22  1.093204   0.8
B   2    22  1.093204   0.5
C   3    23  2.035373   1.3
C   3    23  2.035373   6.5
C   3    23  2.035373   7.1

我怎样才能做到这一点?

尝试左合并。要维护索引,您需要在 marge 之前和之后使用 reset_index set_index

res = df2.reset_index()
         .merge(df1, how='left')
         .set_index('index')
         .loc[:, ['a', 'b', 'c', 'd']]
print(res)
#        a   b         c    d
# index                      
# A      1  21  1.135899  5.5
# A      1  21  1.135899  3.3
# A      1  21  1.135899  2.1
# B      2  22  1.093204  0.8
# B      2  22  1.093204  0.5
# C      3  23  2.035373  1.3
# C      3  23  2.035373  6.5
# C      3  23  2.035373  7.1

要附加df1的所有列(如果df2不存在(,请按difference过滤,默认情况下join左连接:

df = df2.join(df1[df1.columns.difference(df2.columns)])
print (df)
   a   b    d  X  Y         c
A  1  21  5.5  P  Q  1.135899
A  1  21  3.3  P  Q  1.135899
A  1  21  2.1  P  Q  1.135899
B  2  22  0.8  P  Q  1.093204
B  2  22  0.5  P  Q  1.093204
C  3  23  1.3  P  Q  2.035373
C  3  23  6.5  P  Q  2.035373
C  3  23  7.1  P  Q  2.035373

如果只需要一些列,则按list添加子集:

df = df2.join(df1[df1.columns.difference(df2.columns)])[['a','b','c','d']]
print (df)
   a   b         c    d
A  1  21  1.135899  5.5
A  1  21  1.135899  3.3
A  1  21  1.135899  2.1
B  2  22  1.093204  0.8
B  2  22  1.093204  0.5
C  3  23  2.035373  1.3
C  3  23  2.035373  6.5
C  3  23  2.035373  7.1

细节:

print (df1[df1.columns.difference(df2.columns)])
   X  Y         c
A  P  Q  1.135899
B  P  Q  1.093204
C  P  Q  2.035373
D  P  Q  0.350060
E  P  Q -0.939962

最新更新