Sûr! Installer:
>>> import pandas as pd
>>> from random import randint
>>> df = pd.DataFrame({'A': [randint(1, 9) for x in range(10)],
'B': [randint(1, 9)*10 for x in range(10)],
'C': [randint(1, 9)*100 for x in range(10)]})
>>> df
A B C
0 9 40 300
1 9 70 700
2 5 70 900
3 8 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
Nous pouvons appliquer des opérations sur les colonnes et obtenir des objets de la série booléenne:
>>> df["B"] > 50
0 False
1 True
2 True
3 True
4 False
5 False
6 True
7 True
8 True
9 True
Name: B
>>> (df["B"] > 50) & (df["C"] == 900)
0 False
1 False
2 True
3 True
4 False
5 False
6 False
7 False
8 False
9 False
[Mise à jour, pour passer au nouveau style .loc
]:
Et puis nous pouvons les utiliser pour indexer dans l'objet. Pour un accès en lecture, vous pouvez chaîner des index:
>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
2 5
3 8
Name: A, dtype: int64
mais vous pouvez avoir des ennuis à cause de la différence entre une vue et une copie en faisant cela pour l'accès en écriture. Vous pouvez utiliser à la .loc
place:
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
2 5
3 8
Name: A, dtype: int64
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
array([5, 8], dtype=int64)
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
>>> df
A B C
0 9 40 300
1 9 70 700
2 5000 70 900
3 8000 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
Notez que j'ai accidentellement tapé == 900
et non != 900
, ou ~(df["C"] == 900)
, mais je suis trop paresseux pour le corriger. Exercice pour le lecteur. : ^)
df.query
etpd.eval
semblent être de bons ajustements pour ce cas d'utilisation. Pour plus d'informations sur lapd.eval()
famille de fonctions, leurs caractéristiques et leurs cas d'utilisation, veuillez consulter Évaluation des expressions dynamiques dans les pandas à l'aide de pd.eval () .