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.
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
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
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.
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")
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