[Serie Python Fennel Bean] PANDAS Cómo seleccionar filas de DataFrame en función de los valores de las columnas

Al programar en Python, a veces resulta interesante utilizar diferentes métodos para lograr el mismo objetivo. Esto me recuerda al Kong Yiji de Lu Xun. Kong Yiji investigó mucho sobre las cuatro formas de escribir la palabra hinojo para los frijoles de hinojo. No me atrevo a compararme con Kong Yiji, así que aquí colecciono algunos frijoles de hinojo Python para el disfrute de todos los programadores.

SELECT *
FROM table_name
WHERE column_name = value

La declaración SQL anterior se puede utilizar para seleccionar registros calificados en la base de datos en función de los valores de los campos. Entonces, ¿cómo seleccionar filas en función de los valores de las columnas en DataFrame?

Fuente de datos de prueba para este artículo: 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

Frijol de hinojo 1: [] Índice

La forma más intuitiva es filtrar filas por condiciones lógicas. En condiciones lógicas, utilice == para iguales, != para no iguales y >, <, >= y <=. Al combinar varias condiciones, utilice & o | en lugar de ~. Si se debe utilizar isin dentro de un rango determinado. Los ejemplos son los siguientes:

>>> 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

Frijol de hinojo II: índice de etiquetas

El índice de etiquetas acepta una matriz booleana como entrada, por lo que las filas se pueden filtrar usando etiquetas del índice de filas.

>>> # 选取性别为男性的行
>>> 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

Hinojo tres: índice de ubicación

El índice de posición acepta una matriz booleana como entrada, por lo que las filas se pueden filtrar utilizando la posición del índice de fila.

>>> 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

Hinojo cuatro: llamar a una función

Las funciones se pueden utilizar para los tres tipos de índices anteriores. Ya conoces las funciones.

>>> 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

Hinojo Cinco: consulta

Bueno, a aquellos que estén familiarizados con SQL definitivamente les gustará esto.

>>> # 选取小费超过 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

Frijoles de hinojo seis: donde

¿Dónde se pueden cambiar los que no cumplen las condiciones a NaN y luego hacer 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

Hay muchas formas de seleccionar filas. A continuación se muestran algunos aspectos básicos del DataFrame de índice único. Es curioso. Para obtener documentación detallada, visite: https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html

Supongo que te gusta

Origin blog.csdn.net/mouse2018/article/details/114686961
Recomendado
Clasificación