2016-02-08 123 views
1
多發性列

想象我有熊貓以下DataFrames:如何避免Pandas.Merge

In [7]: A= pd.DataFrame([['foo'],['bar'],['quz'],['baz']],columns=['key']) 

In [8]: A['value'] = 'None' 

In [9]: A 
Out[9]: 
    key value 
0 foo None 
1 bar None 
2 quz None 
3 baz None 

In [10]: B = pd.DataFrame([['foo',5],['bar',6],['quz',7]],columns= ['key','value']) 

In [11]: B 
Out[11]: 
    key value 
0 foo  5 
1 bar  6 
2 quz  7 

In [12]: pd.merge(A,B, on='key', how='outer') 
Out[12]: 
    key value_x value_y 
0 foo None  5 
1 bar None  6 
2 quz None  7 
3 baz None  NaN 

但我要的是(基本上避免了重複列):

key value 
0 foo 5 
1 bar 6 
2 quz 7 
3 baz NaN 

我猜想我可以把輸出並刪除_x值,並重新命名_y但是,似乎是矯枉過正。在SQL上這將是微不足道的。

編輯:

約翰爲recomended使用:

In [1]: A.set_index('key', inplace=True) 
     A.update(B.set_index('key'), join='left', overwrite=True) 
     A.reset_index(inplace=True) 

這工作和做什麼,我提出的要求。

+0

的可能的複製[?如何更新大熊貓現有數據幀(http://stackoverflow.com/questions/18726497/how:

第二溶液還可以與更新的索引使用-to-更新現有的數據幀功能於熊貓) – root

+0

@root它們是類似的問題,但是這個問題專門詢問如何鍵列上結合起來。 – johnchase

+0

@johnchase:我掛的問題,專門用一個鍵列合併交易,實際上是在更普遍的,因爲它有兩個鍵列,而不是一個交易。同樣的方法適用於在單個鍵列上組合。查看接受答案的編輯。 – root

回答

1

在你合併兩個dataframes與同一列的例子,一個包含字符串(「無」)的其它整數,大熊貓不知道你要保留,哪些應該被替換的列值,因此它創建兩個列。

您可以使用update代替

In [10]: A.update(B, join='left', overwrite=True) 
In [11]: A 
Out[11]: 

    key value 
0 foo 5 
1 bar 6 
2 quz 7 
3 baz NaN 

另一種解決方案是隻註明您要爲給定列的值:

In [15]: A.loc[B.index, 'value'] = B.value 
In [16]: A 
Out[16]: 

    key value 
0 foo 5 
1 bar 6 
2 quz 7 
3 baz NaN 

個人而言,我傾向於第二種方案,因爲我很清楚發生了什麼,但第一個可能更接近你在你的問題中尋找的東西。

編輯:

如果指數不匹配,我不太清楚如何做到這一點。因此,我建議讓他們匹配:

In [1]: A.set_index('key', inplace=True) 
     A.update(B.set_index('key'), join='left', overwrite=True) 
     A.reset_index(inplace=True) 

這可能是因爲有更好的方式來做到這一點,但我不相信,大熊貓必須徹底執行此操作的一種方式。

In [24]: A.set_index('key', inplace=True) 
     A.loc[B.key, 'value'] = B.value.tolist() 
+0

感謝約翰。在我的例子中,索引匹配(即兩種情況下,foo的索引都是0)。如果情況並非如此,我必須加入Key而不是Index? – Yona

+0

僅供參考,爲您的「編輯」使用的更新功能工作正常,但該方法的.loc沒有(至少我的完整數據集)。 – Yona

+0

@Yona用'.loc'查看方法的最近編輯。它看起來有點不同,'tolist()'方法需要被調用來忽略索引 – johnchase