Python Pandas - 合并多个数据帧

时间:2018-05-22 19:29:36

标签: python excel pandas merge xlsx

我需要使用Pandas合并两个.xlsx文件。数据框格式如下: 数据框1:

+-------+-------+-------+-------+-------+
| Index | Col_A | Col_B | Col_C | Col_Q | 
+-------+-------+-------+-------+-------+ 
|   1   |   A1  |   B1  |   C1  |   Q1  | 
|   2   |   A2  |   B2  |   C2  |   Q2  | 
|   3   |   A3  |   B3  |   C3  |   Q3  | 
|  ...  |  ...  |  ...  |  ...  |  ...  | 
|  100  |  A100 |  B100 |  C100 |  Q100 | 
+-------+-------+-------+-------+-------+

数据框2:

+-------+--------+--------+--------+ 
| Index |  Col_X |  Col_Y |  Col_Z | 
+-------+--------+--------+--------+ 
|   1   | XData1 | YData1 | Part 1 | 
|   2   | XData2 | YData2 | Part 2 | 
|   3   | XData3 | YData3 | Part 3 | 
|  ...  |  ...   |  ...   |  ...   | 
|   N   | XDataN | YDataN | Part N | 
+-------+--------+--------+--------+

数据帧2中的Col_Z是唯一的部件号,N是小于100的值。此部件号将与DF1的Col_A,Col_B或Col_C中的一个且仅一个值匹配。如果部件号与其中一个值匹配,我想将数据帧2的该行中的所有数据合并到数据帧1的右侧。最终表应如下所示: 数据框3:

+-------+-------+-------+-------+-------+-------+--------+--------+--------+
| Index | Col_A | Col_B | Col_C | Col_Q | Index |  Col_A |  Col_B |  Col_Z |
+-------+-------+-------+-------+-------+-------+--------+--------+--------+
|   1   |  A1   |  B1   |   C1  |  Q1   |   X   | XDataX | YDataX | Part X | 
|   2   |  A2   |  B2   |   C2  |  Q2   |   Y   | XDataY | YDataY | Part Y | 
|   3   |  A3   |  B3   |   C3  |  Q3   |   Z   | XDataZ | YDataZ | Part Z | 
|  ...  |  ...  |  ...  |  ...  |  ...  |  ...  |  ...   |  ...   |  ...   | 
|  100  |  A100 | B100  |  C100 | Q100  |   N   | XDataN | YDataN | Part N | 
+-------+-------+-------+-------+-------+-------+--------+--------+--------+

我想保持DF1和DF2的索引重新排列,以便Col_Z与Col_A,Col_B或Col_C匹配。 我尝试的是三个单独的合并命令,其中left_on分别是Col_A,Col_B和Col_C。在所有三种情况下,属性right_on都是Col_Z。这将为Col_A,Col_B和Col_C与部件号匹配的实例提供三个新数据框。当我尝试合并这些数据帧以创建具有所有信息的最终数据帧时,我会遇到诸如数据向右移动等问题。关于解决方案的任何想法?

1 个答案:

答案 0 :(得分:0)

如果您已创建合并的数据框,例如:

dfa = df1.merge(df2, left_on = 'Col_A', right_on = 'Col_Z', how = 'left')

请注意how = 'left'保留df1的所有数据。对于Col_B和Col_C也有同样的想法,那么你可以这样做:

df_output = dfa.fillna(dfb).fillna(dfc)

您将nan中的dfa填充dfb然后dfc的值,如果它们存在且不是nan