2016-01-12 83 views
1

選擇行:get subsection of df based on multiple conditions使用系列從這個線程繼續DF大熊貓

我想拉基於其存儲在一個系列的對象多個條件給定的行。

columns = ['is_net', 'is_pct', 'is_mean', 'is_wgted', 'is_sum'] 
index = ['a','b','c','d'] 
data = [['True','True','False','False', 'False'], 
     ['True','True','True','False', 'False'], 
     ['True','True','False','False', 'True'], 
     ['True','True','False','True', 'False']] 

df = pd.DataFrame(columns=columns, index=index, data=data) 
df 

    is_net is_pct is_mean is_wgted is_sum 
a True True False False False 
b True True True False False 
c True True False False True 
d True True False True False 

我的條件:

d={'is_net': 'True', 'is_sum': 'True'} 
s=pd.Series(d) 

預期輸出:

is_net is_pct is_mean is_wgted is_sum 
c True True False False True 

我的失敗嘗試:

(df == s).all(axis=1) 


a False 
b False 
c False 
d False 
dtype: bool 

不知道爲什麼 'C' 是假的兩個條件時,遇到了。

請注意,我可以達到所需的結果,但我寧願使用Series方法。

df[(df['is_net']=='True') & (df['is_sum']=='True')] 

回答

1

因爲你只需要2個條件,我們可以sum這些和過濾DF:

In [55]: 
df[(df == s).sum(axis=1) == 2] 
​ 
Out[55]: 
    is_net is_pct is_mean is_wgted is_sum 
c True True False False True 

這工作,因爲布爾值轉換爲10TrueFalse

In [56]: 
(df == s).sum(axis=1) 
​ 
Out[56]: 
a 1 
b 1 
c 2 
d 1 
dtype: int64 
+0

將這項工作,如果有超過2,但少LEN(df.columns)? –

+0

對不起,如果您有更多條件但總條件少於列數,您能解釋一下嗎?如果是這樣,是不是一樣? – EdChum

+0

對不起,超過2個條件。太好了,我會試試看。 –

1

您可以通過爲您的列添加子集來修改一點您的解決方案:

In [219]: df[(df == s)[['is_net', 'is_sum']].all(axis=1)] 
Out[219]: 
    is_net is_pct is_mean is_wgted is_sum 
c True True False False True 

或:

In [219]: df[(df == s)[s.index].all(axis=1)] 
Out[219]: 
    is_net is_pct is_mean is_wgted is_sum 
c True True False False True 
+0

感謝您的努力! –