加入3个熊猫数据帧

时间:2017-04-10 12:04:40

标签: python pandas join

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

我的问题是,如何将左右数据帧与第3个数据帧一起加入?

我需要支持以下内容:

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

     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或多对1。
    3. 目标是df1中的所有行都将与df2中的所有行匹配。 (红利问题),如果df1到df2中不存在匹配,是否可以保留df1的记录?与df2相同?

      谢谢

1 个答案:

答案 0 :(得分: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

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