2017-04-10 152 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',但可能需要調整結果以匹配所需的輸出。