web-dev-qa-db-fra.com

Pandas Comment filtrer une série

J'ai une série comme celle-ci après avoir fait groupby ('name') et utilisé la fonction mean () sur une autre colonne

name
383      3.000000
663      1.000000
726      1.000000
737      9.000000
833      8.166667

Quelqu'un pourrait-il me montrer comment filtrer les lignes avec une valeur moyenne de 1.000000? Merci et j'apprécie grandement votre aide.

45
Kiem Nguyen
In [5]:

import pandas as pd

test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}

s = pd.Series(test)
s = s[s != 1]
s
Out[0]:
383    3.000000
737    9.000000
833    8.166667
dtype: float64
75
Andrew

A partir de la version 0.18+ de pandas, filtrer une série peut également être effectué comme ci-dessous

    test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}

pd.Series(test).where(lambda x : x!=1).dropna()

Commander: http://pandas.pydata.org/pandas-docs/version/0.18.1/whatsnew.html#method-chaininng-improvements

34
DACW

Comme DACW a souligné , il y a des améliorations de chaînes de méthodes dans les pandas 0.18.1 qui font très bien ce que vous recherchez.

Plutôt que d'utiliser .where, vous pouvez transmettre votre fonction à l'indexeur .loc ou à l'indexeur de séries [] et éviter l'appel à .dropna:

test = pd.Series({
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
})

test.loc[lambda x : x!=1]

test[lambda x: x!=1]

Un comportement similaire est pris en charge sur les classes DataFrame et NDFrame. 

17
Gordon Bean

Une méthode rapide consiste à reconstruire en utilisant numpy pour découper les tableaux sous-jacents. Voir les horaires ci-dessous.

mask = s.values != 1
pd.Series(s.values[mask], s.index[mask])

0
383    3.000000
737    9.000000
833    8.166667
dtype: float64

timing naïf

 enter image description here

15
piRSquared

Une autre méthode consiste à convertir d’abord en DataFrame et à utiliser la méthode query (en supposant que numexpr est installé):

import pandas as pd

test = {
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
}

s = pd.Series(test)
s.to_frame(name='x').query("x != 1")
5
ksindi

Si vous aimez une opération chaînée, vous pouvez également utiliser la fonction compress:

test = pd.Series({
383:    3.000000,
663:    1.000000,
726:    1.000000,
737:    9.000000,
833:    8.166667
})

test.compress(lambda x: x != 1)

# 383    3.000000
# 737    9.000000
# 833    8.166667
# dtype: float64
5
Psidom