Как выбрать строки из фрейма данных на основе значений столбцов?

Опубликовано: 27 Марта, 2022

Предварительное условие: Pandas.Dataframes в Python

Строки фрейма данных могут быть выбраны на основе условий, поскольку мы используем запросы SQL. Различные методы достижения этого объясняются в этой статье с примерами. Для объяснения метода был создан набор данных, который содержит данные о набранных 10 людьми очках в различных играх. Набор данных загружается в фрейм данных и сначала визуализируется. Десять человек с уникальным идентификатором игрока ( Pid ) играли в разные игры с разными идентификаторами игры ( game_id ), и очки, набранные в каждой игре, добавляются в виде записи в таблицу. Некоторые очки игрока не записываются, поэтому в таблице отображается значение NaN.

Note: To get the CSV file used, click here.

Python3

import pandas as pd
  
df=pd.read_csv(r"__your file path__example2.csv")
print(df)

Выход:

Логический метод индексации

В этом методе для указанного условия столбца каждая строка проверяется на истинность / ложь. Строки, которые дают True, будут учитываться для вывода. Этого можно добиться разными способами. Используемый запрос: Выбрать строки, в которых столбец Pid = 'p01'

Example 1: Checking condition while indexing

Python3

# Choose entries with id p01
df_new = df[df["Pid"] == "p01"]
  
print(df_new)

Выход

Пример 2: Указание переменной условия 'маска'

The selected rows are assigned to a new dataframe with the index of rows from old dataframe as an index in the new one and the columns remaining the same.

Python3



# condition mask
mask = df["Pid"] == "p01"
  
# new dataframe with selected rows
df_new = pd.DataFrame(df[mask])
  
print(df_new)

Выход

Пример 3: объединение маски и свойства dataframes.values

The query here is Select the rows with game_id ‘g21’.

Python3

# condition with df.values property
mask = df["game_id"].values == "g21"
  
# new dataframe
df_new = df[mask]
  
print(df_new)

Выход

Позиционная индексация

Методы loc () и iloc () могут использоваться для нарезки фреймов данных в Python. Среди различий между loc () и iloc () важно отметить то, что iloc () принимает только целочисленные индексы, в то время как loc () может также принимать логические индексы.

Пример 1: Использование loc ()

The mask gives the boolean value as an index for each row and whichever rows evaluate to true will appear in the result. Here, the query is to select the rows where game_id is g21.

Python3

# for boolean indexing
mask = df["game_id"].values == "g21"
  
# using loc() method
df_new = df.loc[mask]
  
print(df_new)

Выход

Пример 2: Использование iloc ()

The query is the same as the one taken above. The iloc() takes only integers as an argument and thus, the mask array is passed as a parameter to the numpy’s flatnonzero() function that returns the index in the list where the value is not zero (false)

Python3

# condition mask
mask = df["game_id"].values == "g21"
print("Mask array :", mask)
  
# getting non zero indices
pos = np.flatnonzero(mask)
print(" Rows selected :", pos)
  
# selecting rows
df.iloc[pos]

Выход

Использование dataframe.query ()

Запрос () принимает выражение, которое возвращает логическое значение, обрабатывает все строки в фрейме данных и возвращает результирующий фрейм данных с выбранными строками.

Example 1: Select  rows where name=”Albert”

Python3

df.query("name=="Albert"")

Выход

Пример 2: выберите ряды, в которых количество очков> 50 и игрок не Альберт.

This example is to demonstrate that logical operators like AND/OR can be used to check multiple conditions.

Python3

df.query("points>50 & name!="Albert"")

Выход

Использование isin ()

Этот метод фрейма данных принимает в качестве параметра итерацию, серию или другой фрейм данных и проверяет, существуют ли в нем элементы фрейма данных. Строки, которые оцениваются как истинные, считаются результатом.

Example 1: Select the rows where players are Albert, Louis, and John.

Python3

#Players to be selected
li=["Albert","Louis","John"]
  
df[df.name.isin(li)]

Выход

Пример 2: выберите ряды, в которых очки> 50 и игроки не Альберт, Луис и Джон.

The tiled symbol (~) provides the negation of the expression evaluated.

Python3

# values to be present in selected rows
li = ["Albert", "Louis", "John"]
  
# selecting rows from dataframe
df[(df.points > 50) & (~df.name.isin(li))]

Выход

Использование np.where ()

Функция numpy where () может быть объединена с функцией isin () pandas для получения более быстрого результата. Доказано, что numpy.where () дает результаты быстрее, чем обычные методы, использованные выше.

Example:

Python3

import numpy as np
  
df_new = df.iloc[np.where(df.name.isin(li))]

Выход

Comparison with other methods

Python3

# to calculate timing
import numpy as np
% % timeit
  
  
# using mixture of numpy and pandas method
df_new = df.iloc[np.where(df.name.isin(li))]

Output:

756 µs ± 132 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Python3

# to calculate time
%%timeit
  
li=["Albert","Louis","John"]
  
# Pandas method only
df[(df.points>50)&(~df.name.isin(li))]

Выход

1.7 ms ± 307 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.