2017-03-01 71 views
2
import pandas as pd 
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 
         'A': [1, 2, 3, 4], 
         'B': [1, 2, 3, 4]}) 
right = pd.DataFrame({'key': ['K0', 'K1'],}) 
#left df       #right df 
    A B key      key 
0 1 1 K0      0 K0 
1 2 2 K1      1 K1 
3 3 3 K2 
4 4 4 K3 

首先,我想創建一個數據幀只包含K0,K1如何合併這兩個DataFrames

first = pd.merge(left, right, on='key') 
#first df 
    A B key     
0 1 1 K0      
1 2 2 K1 

然後我想創建一個數據幀僅包含K2,K3

#Expectation df 
    A B key 
0 3 3 K2 
0 4 4 K3 

我意識到這應該由左(右)外部方法完成,但我對這種方法感到困惑。

回答

4

使用isin建立一個布爾面膜:

mask = left['key'].isin(right['key']) 

然後使用.loc[mask]基於掩碼選擇行:

import pandas as pd 
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 
         'A': [1, 2, 3, 4], 
         'B': [1, 2, 3, 4]}) 
right = pd.DataFrame({'key': ['K0', 'K1'],}) 
mask = left['key'].isin(right['key']) 
first, second = left.loc[mask], left.loc[~mask] 

產生

In [88]: first 
Out[88]: 
    A B key 
0 1 1 K0 
1 2 2 K1 

In [89]: second 
Out[89]: 
    A B key 
2 3 3 K2 
3 4 4 K3 
0

,我喜歡的方式做這種合併搜索是: 首先,您設置索引上的鍵(這是一開始很相似的概念,對吧?):當你合併或加入熊貓2個DataFrames

left.set_index('key',inplace=True) 
right.set_index('key',inplace=True) 

然後,你要pd.concat http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html使用,這是方法大熊貓用於所有的合併和連接操作

In[10]: pd.concat([left,right], axis=1) 
Out[10]: 
    A B 
K0 1 1 
K1 2 2 
K2 3 3 
K3 4 4 

現在,您可以輕鬆地選擇所需的密鑰(熊貓加入和合並方法也使用了這種引擎蓋下。):

In[17]: df = pd.concat([left,right], axis=1) 
In[18]: df.loc[['K0','K1'],:] 
Out[18]: 

    A B 
K0 1 1 
K1 2 2