我正在尝试在python中合并三个pandas DataFrame。以下是我尝试合并的三个DataFrame以及所需的输出(NaN为null)。我知道用左合并将两个表连接起来是行不通的。两次合并以达到所需输出的正确顺序是什么? (如果不可能的话,不必是一行代码)谢谢!
df1
+--------+
| x |
+--------+
| 1 |
| 2 |
| 3 |
+--------+
df2
+--------+---+
| x | b |
+--------+---+
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | D |
| 2 | E |
| 2 | F |
| 3 | G |
+--------+---+
df3
+--------+---+
| x | c |
+--------+---+
| 1 | L |
| 1 | M |
| 2 | N |
| 3 | O |
| 3 | P |
| 3 | Q |
+--------+---+
df_result
+----------------+-----+-----+
| x | b | c |
+----------------+-----+-----+
| 1 | A | NaN |
| 1 | B | NaN |
| 1 | C | NaN |
| 1 | NaN | L |
| 1 | NaN | M |
| 2 | D | NaN |
| 2 | E | NaN |
| 2 | F | NaN |
| 2 | NaN | N |
| 3 | G | NaN |
| 3 | NaN | O |
| 3 | NaN | P |
| 3 | NaN | Q |
+----------------+-----+-----+
以下尝试不会导致df_result数据帧如上所示:
attempt1:
df_step1 = df1.merge(df2, on='x', how='left')
df_result = df_step1.merge(df3, on='x', how='left')
df_result
我尝试了左右,左,右,外部和内部联接/合并的不同组合
attempt2:
df_result = pd.concat([table1, table2, table3], axis=1, sort='false')
df_result
这也不会产生所需的df_result DataFrame。
也许我需要结合使用concat和merge?或者,因为基本上是每个条目的新行,所以我可以编写一个for循环,以df的新系列输入每个条目的信息。像这样:
for i in range(len(df1.index)):
for j in range (len(df2.index)):
df_result = df_result.append(df2[j])
for k in range (len(df3.index)):
df_result = df_result.append(df3[k])
答案 0 :(得分:1)
我发现连接第二个和第三个数据帧,然后再按x
列进行排序,使我产生的df与上面df_result
中定义的预期输出匹配:
df1 = pd.DataFrame({'x': [1,2,3]})
df2 = pd.DataFrame({'x': [1,1,1,2,2,2,3],
'b': ['A', 'B', 'C', 'D', 'E', 'F', 'G']})
df3 = pd.DataFrame({'x': [1,1,2,3,3,3],
'c': ['L', 'M', 'N', 'O', 'P', 'Q']})
pd.concat([df2, df3], sort=False).sort_values('x').set_index('x', drop=True)
b c
x
1 A NaN
1 B NaN
1 C NaN
1 NaN L
1 NaN M
2 D NaN
2 E NaN
2 F NaN
2 NaN N
3 G NaN
3 NaN O
3 NaN P
3 NaN Q
答案 1 :(得分:0)
是您需要的吗?
import pandas as pd
df2 = pd.DataFrame(data=[(1, 'A'),
(1, 'B'),
(1, 'C'),
(2, 'D'),
(2, 'E'),
(3, 'F'),
(3, 'G')], columns = ("x","b"))
df3 = pd.DataFrame(data=[(1, 'L'),
(1, 'M'),
(2, 'N'),
(3, 'L'),
(3, 'O'),
(3, 'P'),
(3, 'Q')], columns= ("x","c"))
df2["c"] = float('nan')
df3["b"] = float('nan')
df_result=pd.concat((df2,df3), sort=True)[["x","b","c"]]
df_result.sort_values("x")
我知道了
x b c
0 1 A NaN
1 1 B NaN
2 1 C NaN
0 1 NaN L
1 1 NaN M
3 2 D NaN
4 2 E NaN
2 2 NaN N
5 3 F NaN
6 3 G NaN
3 3 NaN L
4 3 NaN O
5 3 NaN P
6 3 NaN Q