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