Python Pandas - 合并多个数据帧
Python Pandas - Merge Multiple Dataframes
我有两个 .xlsx 文件需要使用 Pandas 合并。数据帧的格式如下:
数据框 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 的值。此零件编号将与 Col_A、Col_B,或 DF1 的 Col_C。如果部件号与其中一个值匹配,我想将数据帧 2 的那一行中的所有数据合并到数据帧 1 的右侧。最终的 table 应该如下所示:
数据框 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 匹配部件号的实例提供三个新数据框。当我尝试合并这些数据框以创建包含所有信息的最终数据框时,我 运行 遇到诸如数据向右移动等问题。关于解决方案的任何想法?
如果您创建了合并数据框,例如:
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)
您将使用 dfb
中的值填充 dfa
中的 nan
,如果它们存在且不存在 nan
,则填充 dfc
。
我有两个 .xlsx 文件需要使用 Pandas 合并。数据帧的格式如下: 数据框 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 的值。此零件编号将与 Col_A、Col_B,或 DF1 的 Col_C。如果部件号与其中一个值匹配,我想将数据帧 2 的那一行中的所有数据合并到数据帧 1 的右侧。最终的 table 应该如下所示: 数据框 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 匹配部件号的实例提供三个新数据框。当我尝试合并这些数据框以创建包含所有信息的最终数据框时,我 运行 遇到诸如数据向右移动等问题。关于解决方案的任何想法?
如果您创建了合并数据框,例如:
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)
您将使用 dfb
中的值填充 dfa
中的 nan
,如果它们存在且不存在 nan
,则填充 dfc
。