2017-04-10 111 views
2

我有兩個DataFrame,我想根據與列名稱df1相交的列名稱df2子集。在R這很容易。根據另一個DataFrame的列名稱來設置DataFrame

R代碼:

df1 <- data.frame(a=rnorm(5), b=rnorm(5)) 
df2 <- data.frame(a=rnorm(5), b=rnorm(5), c=rnorm(5)) 

df2[names(df2) %in% names(df1)] 
      a   b 
1 -0.8173361 0.6450052 
2 -0.8046676 0.6441492 
3 -0.3545996 -1.6545289 
4 1.3364769 -0.4340254 
5 -0.6013046 1.6118360 

但是,我不知道如何在pandas做到這一點。

pandas嘗試:

df1 = pd.DataFrame({'a': np.random.standard_normal((5,)), 'b': np.random.standard_normal((5,))}) 
df2 = pd.DataFrame({'a': np.random.standard_normal((5,)), 'b': np.random.standard_normal((5,)), 'c': np.random.standard_normal((5,))}) 

df2[df2.columns in df1.columns] 

這導致TypeError: unhashable type: 'Index'。什麼是正確的方法來做到這一點?

回答

1

如果您需要一個真正的交集,因爲.columns會生成支持基本集合操作的Index對象,所以您可以使用&

df2[df1.columns & df2.columns] 

或等效地Index.intersection

df2[df1.columns.intersection(df2.columns)] 

然而,如果你保證df1只是df2列子集,你可以直接使用

df2[df1.columns] 

,或者如果分配,

df2.loc[:, df1.columns] 

演示

>>> df2[df1.columns & df2.columns] 
      a   b 
0 1.952230 -0.641574 
1 0.804606 -1.509773 
2 -0.360106 0.939992 
3 0.471858 -0.025248 
4 -0.663493 2.031343 

>>> df2.loc[:, df1.columns] 
      a   b 
0 1.952230 -0.641574 
1 0.804606 -1.509773 
2 -0.360106 0.939992 
3 0.471858 -0.025248 
4 -0.663493 2.031343 
1

等效是:

df2[df1.columns.intersection(df2.columns)] 
Out: 
      a   b 
0 -0.019703 0.379820 
1 0.040658 0.243309 
2 1.103032 0.066454 
3 -0.921378 1.016017 
4 0.188666 -0.626612 

有了這個,如果df1列不存在df2,你不會得到一個KeyError異常。

相關問題