2016-01-12 1 views
1

Suite de cette discussion: get subsection of df based on multiple conditionssérie utilisée pour sélectionner les lignes de df pandas géants

Je voudrais tirer des lignes sur plusieurs données en fonction des conditions qui sont stockées dans un objet de la série.

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 

Mes conditions:

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

Sortie prévue:

is_net is_pct is_mean is_wgted is_sum 
c True True False False True 

Ma tentative avortée:

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


a False 
b False 
c False 
d False 
dtype: bool 

Je ne sais pas pourquoi 'c' est faux lorsque les deux conditions furent rencontrés.

Remarque, je peux obtenir les résultats souhaités comme cela, mais je préfère utiliser la méthode des séries.

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

Répondre

1

Comme vous avez seulement 2 conditions, nous pouvons sum ces derniers et filtrer la 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 

Cela fonctionne parce que booléens convertir en 1 et 0 pour True et False:

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

Est-ce que ce travail s'il y avait plus de 2 mais moins len (df.columns)? –

+0

Désolé, pouvez-vous expliquer mieux que vous voulez dire si vous avez eu plus de conditions mais que les conditions totales sont inférieures au nombre de colonnes? Si oui, n'est-ce pas la même chose? – EdChum

+0

désolé oui, plus de 2 conditions. C'est génial, je vais essayer. –

1

Vous pouvez modifier un peu votre solution en ajoutant un sous-ensemble pour vos colonnes:

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 

ou:

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

Merci pour l'effort! –