【问题标题】:Combine Three DataFrames Using Pandas in Python在 Python 中使用 Pandas 组合三个 DataFrame
【发布时间】:2019-02-11 15:52:58
【问题描述】:

我正在尝试在 python 中组合三个 pandas DataFrame。下面是我尝试组合的三个 DataFrame 以及我想要的输出(其中 NaN 为空)。我知道用左合并加入这两个表是行不通的。实现所需输出的两次合并的正确顺序是什么? (如果不可能,不必是一行代码)谢谢!

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 DataFrame:

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 中的 O 是哪里
  • 为什么“x”是唯一只有 1 行而不是 2 行的值?或者,是“x”、“b”和“c”列名吗?
  • 我想你想要一个 FULL OUTER JOIN 的类似物,不是吗?
  • 嗯,pd.concat([df1, df2])是你想要的吗?
  • @coldspeed 是的。我没有正确粘贴表格,因此帖子中的格式已关闭。第一行应该是列名。我将编辑原始帖子。

标签: python pandas dataframe join merge


【解决方案1】:

我发现连接第二个和第三个数据帧,然后按x 列排序允许我生成与上面df_result 中定义的预期输出相匹配的df:

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

【讨论】:

    【解决方案2】:

    这是你需要的吗?

    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
    

    【讨论】:

    • 啊哈!是的!谢谢你。这解决了它。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 2014-01-08
    • 2014-02-08
    • 2015-09-29
    • 2019-02-17
    • 2012-06-13
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多