2017-04-10 88 views
0

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

我的问题是,我怎样才能将第三个数据框连接到左右数据框?

我需要支持以下内容:

  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或许多为1.

目标是来自df1的所有行将与df2中的所有行匹配。可选地,(奖金问题),如果在df1到df2中不存在匹配,df1的记录是否可以保存?与df2相同?

谢谢

+0

你可以告诉你如何看待输出数据帧吗?这并不完全清楚你想要什么结果。 – ASGM

回答

1

您可以在join_df左栏和df1df2索引使用DataFrame.merge和匹配。使用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',但可能需要调整结果以匹配所需的输出。