【问题标题】:Joining 3 panda dataframes加入 3 个熊猫数据框
【发布时间】:2017-04-10 21:51:29
【问题描述】:

首先让我这么说吧,我不确定这是否是最好的方法,但我编写了一些代码来创建一个 pandas 的数据帧,其中包含来自我左侧数据帧的索引值和来自我右侧数据帧的索引值特定空间条件匹配的地方。这是您的基本空间连接,但具有一些附加属性。索引值是正确的。

我的问题是,如何将左右数据帧与第三个数据帧连接在一起?

我需要支持以下内容:

  1. 如果我想保留所有(来自 df1 和 df2),我该怎么做?
  2. 默认情况下,我想保留所有左侧数据框的值,因此我的连接数据框的值如下:[1, None] 这会是个问题吗?

例子:

 join_df = pd.DataFrame(data=[[0, 2], [1, 3], [2, None]], columns=['left_idx', 'right_idx'])
 df1 = pd.DataFrame([["a", {5:5}], ["b", {4:5}], ["c", {12:5}]], columns=['A1', 'A2'])
 df2 = pd.DataFrame([["b", {'a':5}], ["bbb", {'b':5}], ["ccc", {'c':5}]], columns=['B1', 'B2'])

所以 join_df 是这样工作的:

  1. join_df 中的数据是左侧数据帧 (df1) 的索引,要从 df2 连接的行在第 2 列中。
  2. 连接可以是多对多、1:m 或多对一。

目标是 df1 中的所有行都将与 df2 中的所有行匹配。可选地,(额外问题),如果 df1 到 df2 中不存在匹配项,是否可以保留 df1 的记录?和df2一样吗?

谢谢

【问题讨论】:

  • 你能给出你希望输出数据帧的样子吗?您想要什么结果并不完全清楚。

标签: python pandas join


【解决方案1】:

您可以使用DataFrame.merge 并匹配join_df 的左列和df1df2 的索引。使用 how='left' 将导致 DataFrame 仅包含 join_df 中指定的值。

join_df = join_df.merge(df1, left_on='left_idx', right_index=True, how='left')
join_df = join_df.merge(df2, left_on='right_idx', right_index=True, how='left')

这给出了:

   left_idx  right_idx A1       A2   B1         B2
0         0        2.0  a   {5: 5}  ccc  {u'c': 5}
1         1        3.0  b   {4: 5}  NaN        NaN
2         2        NaN  c  {12: 5}  NaN        NaN

您可以通过指定join_df[df1.columns | df2.columns] 排除idx 列。如果您想避免丢弃值,您可以使用how='outer',但您可能需要调整结果以匹配您想要的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多