在Python中使用熊猫结合三个数据框架

时间:2019-02-11 15:52:59

标签: python pandas dataframe join merge

我正在尝试在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])

2 个答案:

答案 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