Фильтрация строк DataFrame по наличию значения в колонке из заданного списка значений
У меня есть DataFrame в Python с использованием библиотеки pandas, названный rpt
:
rpt
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 47518 entries, ('000002', '20120331') to ('603366', '20091231')
Data columns:
STK_ID 47518 non-null values
STK_Name 47518 non-null values
RPT_Date 47518 non-null values
sales 47518 non-null values
Я могу отфильтровать строки, где идентификатор акции равен '600809'
, следующим образом:
rpt[rpt['STK_ID'] == '600809']
В результате получаю:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 25 entries, ('600809', '20120331') to ('600809', '20060331')
Data columns:
STK_ID 25 non-null values
STK_Name 25 non-null values
RPT_Date 25 non-null values
sales 25 non-null values
Теперь я хочу получить все строки для нескольких акций одновременно, например, для ['600809','600141','600329']
. Я хотел бы использовать следующий синтаксис:
stk_list = ['600809','600141','600329']
rst = rpt[rpt['STK_ID'] in stk_list] # этот код не работает в pandas
Поскольку pandas не принимает эту команду, как я могу достичь своей цели?
5 ответ(ов)
Вы можете использовать метод isin
для фильтрации данных в DataFrame. Например, если у вас есть DataFrame rpt
и список идентификаторов акций stk_list
, вы можете отфильтровать строки, где столбец STK_ID
содержится в этом списке, следующим образом:
filtered_rpt = rpt[rpt['STK_ID'].isin(stk_list)]
Таким образом, в переменной filtered_rpt
будут храниться только те строки из DataFrame rpt
, которые соответствуют идентификаторам акций из stk_list
.
Вы также можете добиться аналогичных результатов, использовав метод query
и знак @
:
Например:
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
df = pd.DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]})
list_of_values = [3, 6]
result = df.query("A in @list_of_values")
print(result)
Результат будет таким:
A B
1 6 2
2 3 3
В данном примере метод query
позволяет отфильтровать DataFrame по значениям, представленным в списке list_of_values
. Знак @
используется для доступа к переменным из внешнего пространства имен внутри строки запроса.
Вы можете использовать query
, например:
b = df.query('a > 1 & a < 5')
Вы также можете использовать диапазоны таким образом:
b = df[(df['a'] > 1) & (df['a'] < 5)]
Этот код создает новый DataFrame b
, который содержит строки из исходного DataFrame df
, где значения в столбце 'a'
находятся в диапазоне от 1 до 5 (не включая 1 и 5).
Извлечение данных с помощью pandas
Вот пример датафрейма:
RPT_Date STK_ID STK_Name sales
0 1980-01-01 0 Arthur 0
1 1980-01-02 1 Beate 4
2 1980-01-03 2 Cecil 2
3 1980-01-04 3 Dana 8
4 1980-01-05 4 Eric 4
5 1980-01-06 5 Fidel 5
6 1980-01-07 6 George 4
7 1980-01-08 7 Hans 7
8 1980-01-09 8 Ingrid 7
9 1980-01-10 9 Jones 4
Существует несколько способов выборки или извлечения данных.
Использование .isin
Наиболее очевидный способ - использовать метод .isin()
. Вы можете создать маску, которая даст серию значений True
/False
, которую можно применить к датафрейму:
mask = df['STK_ID'].isin([4, 2, 6])
mask
0 False
1 False
2 True
3 False
4 True
5 False
6 True
7 False
8 False
9 False
Name: STK_ID, dtype: bool
df[mask]
RPT_Date STK_ID STK_Name sales
2 1980-01-03 2 Cecil 2
4 1980-01-05 4 Eric 4
6 1980-01-07 6 George 4
Использование масок - это простой способ решения задачи, хотя он не всегда эффективен с точки зрения скорости и использования памяти.
С помощью индексации
Установив индекс в столбец STK_ID
, можно использовать встроенный метод среза pandas .loc
.
df.set_index('STK_ID', inplace=True)
RPT_Date STK_Name sales
STK_ID
0 1980-01-01 Arthur 0
1 1980-01-02 Beate 4
2 1980-01-03 Cecil 2
3 1980-01-04 Dana 8
4 1980-01-05 Eric 4
5 1980-01-06 Fidel 5
6 1980-01-07 George 4
7 1980-01-08 Hans 7
8 1980-01-09 Ingrid 7
9 1980-01-10 Jones 4
df.loc[[4, 2, 6]]
RPT_Date STK_Name sales
STK_ID
4 1980-01-05 Eric 4
2 1980-01-03 Cecil 2
6 1980-01-07 George 4
Этот способ более быстрый, даже если установка индекса занимает некоторое время. Однако он экономит время, если вы хотите выполнять несколько таких запросов.
Объединение датафреймов
Это также можно сделать с помощью объединения датафреймов. Этот метод будет более уместен в случаях, когда у вас есть гораздо больше данных, чем в приведенных примерах.
stkid_df = pd.DataFrame({"STK_ID": [4,2,6]})
df.merge(stkid_df, on='STK_ID')
STK_ID RPT_Date STK_Name sales
0 2 1980-01-03 Cecil 2
1 4 1980-01-05 Eric 4
2 6 1980-01-07 George 4
Примечание
Все вышеуказанные методы работают, даже если есть несколько строк с одинаковым значением 'STK_ID'
.
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame
Получить список из колонки или строки DataFrame в pandas?
Выбор строки из pandas Series/DataFrame по целочисленному индексу