[Python Fennel Bean Series] Comment PANDAS sélectionne-t-il les lignes DataFrame en fonction des valeurs des colonnes

Lorsqu’on programme en Python, il est parfois intéressant d’utiliser différentes méthodes pour atteindre un même objectif. Cela me rappelle Kong Yiji de Lu Xun. Kong Yiji a fait de nombreuses recherches sur les quatre façons d'écrire le mot fenouil pour les haricots fenouils. Je n'ose pas me comparer à Kong Yiji, je collectionne donc ici quelques fèves de fenouil Python pour le plaisir de tous les codeurs.

SELECT *
FROM table_name
WHERE column_name = value

L'instruction SQL ci-dessus peut être utilisée pour sélectionner des enregistrements qualifiés en fonction des valeurs des champs dans la base de données, alors comment sélectionner des lignes en fonction des valeurs des colonnes dans DataFrame ?

Source des données de test pour cet article : https://raw.github.com/pandas-dev/pandas/master/pandas/tests/io/data/csv/tips.csv

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.read_csv('tips.csv')
>>> df.head()
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

Haricot fenouil 1 : [] Index

La manière la plus intuitive consiste à filtrer les lignes par conditions logiques. Dans des conditions logiques, utilisez == pour égal, != pour différent, et >, <, >= et <=. Dans le cas de la combinaison de plusieurs conditions, utilisez & pour AND, | pour OR et ~ pour NOT. S'il faut utiliser l'isin dans une certaine plage. Les exemples sont les suivants :

>>> mask = [False] * 244
>>> mask[1] = True
>>> mask[3] = True
>>> df[mask]
   total_bill   tip   sex smoker  day    time  size
1       10.34  1.66  Male     No  Sun  Dinner     3
3       23.68  3.31  Male     No  Sun  Dinner     2

>>> # 选取性别为男性的行
>>> df[df['sex'] == 'Male'].head()
   total_bill   tip   sex smoker  day    time  size
1       10.34  1.66  Male     No  Sun  Dinner     3
2       21.01  3.50  Male     No  Sun  Dinner     3
3       23.68  3.31  Male     No  Sun  Dinner     2
5       25.29  4.71  Male     No  Sun  Dinner     4
6        8.77  2.00  Male     No  Sun  Dinner     2

>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df[(df['tip']>2) | (df['sex']=='Female')].head()
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4
5       25.29  4.71    Male     No  Sun  Dinner     4

Haricots fenouil II : index des étiquettes

L'index d'étiquette accepte un tableau booléen en entrée, de sorte que l'étiquette utilisant l'index de ligne peut filtrer les lignes.

>>> # 选取性别为男性的行
>>> df.loc[df['sex'] == 'Male'].head()
   total_bill   tip   sex smoker  day    time  size
1       10.34  1.66  Male     No  Sun  Dinner     3
2       21.01  3.50  Male     No  Sun  Dinner     3
3       23.68  3.31  Male     No  Sun  Dinner     2
5       25.29  4.71  Male     No  Sun  Dinner     4
6        8.77  2.00  Male     No  Sun  Dinner     2

>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df.loc[(df['tip']>2) | (df['sex']=='Female')].head()
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4
5       25.29  4.71    Male     No  Sun  Dinner     4

>>> # 选择不是周末,且小费大于 5 的行
>>> df.loc[~df['day'].isin(['Sun', 'Sat']) & (df['tip']>5)]
     total_bill   tip     sex smoker   day   time  size
85        34.83  5.17  Female     No  Thur  Lunch     4
88        24.71  5.85    Male     No  Thur  Lunch     2
141       34.30  6.70    Male     No  Thur  Lunch     6

Haricots fenouil trois : indice de localisation

L'index de position accepte un tableau booléen en entrée, de sorte que la position utilisant l'index de ligne peut filtrer les lignes.

>>> mask = list(df['sex'] == 'Male')
>>> df.iloc[mask].head()
   total_bill   tip   sex smoker  day    time  size
1       10.34  1.66  Male     No  Sun  Dinner     3
2       21.01  3.50  Male     No  Sun  Dinner     3
3       23.68  3.31  Male     No  Sun  Dinner     2
5       25.29  4.71  Male     No  Sun  Dinner     4
6        8.77  2.00  Male     No  Sun  Dinner     2

Anise Bean Four : Appeler une fonction

Les trois index ci-dessus peuvent utiliser des fonctions et vous comprenez les fonctions.

>>> df[lambda df: df['tip']>5].head()
    total_bill   tip     sex smoker  day    time  size
23       39.42  7.58    Male     No  Sat  Dinner     4
44       30.40  5.60    Male     No  Sun  Dinner     4
47       32.40  6.00    Male     No  Sun  Dinner     4
52       34.81  5.20  Female     No  Sun  Dinner     4
59       48.27  6.73    Male     No  Sat  Dinner     4

Fenouil Bean Five : requête

Eh bien, ceux qui connaissent SQL doivent l'apprécier.

>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df.query('tip>2 | sex=="Female"').head()
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4
5       25.29  4.71    Male     No  Sun  Dinner     4

>>> # 选择不是周末,且小费大于 5 的行
>>> # @可以引用当前环境中的变量
>>> weekday = ['Sun', 'Sat']
>>> df.query('day not in @weekday & tip>5')
     total_bill   tip     sex smoker   day   time  size
85        34.83  5.17  Female     No  Thur  Lunch     4
88        24.71  5.85    Male     No  Thur  Lunch     2
141       34.30  6.70    Male     No  Thur  Lunch     6

Haricots fenouil six : où

Où peut-on changer ceux non qualifiés en NaN, puis arriver à un dropna.

>>> df.where(df.tip>5).dropna().head()
    total_bill   tip     sex smoker  day    time  size
23       39.42  7.58    Male     No  Sat  Dinner   4.0
44       30.40  5.60    Male     No  Sun  Dinner   4.0
47       32.40  6.00    Male     No  Sun  Dinner   4.0
52       34.81  5.20  Female     No  Sun  Dinner   4.0
59       48.27  6.73    Male     No  Sat  Dinner   4.0

Il existe de nombreuses façons de sélectionner des lignes, voici juste quelques éléments sur le DataFrame à index unique, je plaisante. Pour une documentation détaillée, veuillez consulter : https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html

Je suppose que tu aimes

Origine blog.csdn.net/mouse2018/article/details/114686961
conseillé
Classement