17 авг. 2022 г.
читать 2 мин
Часто вам может понадобиться выбрать строки кадра данных pandas на основе их значения индекса.
Если вы хотите выбрать строки на основе целочисленного индексирования, вы можете использовать функцию .iloc .
Если вы хотите выбрать строки на основе индексации меток, вы можете использовать функцию .loc .
В этом руководстве представлен пример использования каждой из этих функций на практике.
Пример 1: выбор строк на основе целочисленного индексирования
В следующем коде показано, как создать кадр данных pandas и использовать .iloc для выбора строки с целочисленным значением индекса 4 :
import pandas as pd
import numpy as np
#make this example reproducible
np.random.seed (0)
#create DataFrame
df = pd.DataFrame(np.random.rand (6,2), index=range(0,18,3), columns=['A', 'B'])
#view DataFrame
df
A B
0 0.548814 0.715189
3 0.602763 0.544883
6 0.423655 0.645894
9 0.437587 0.891773
12 0.963663 0.383442
15 0.791725 0.528895
#select the 5th row of the DataFrame
df.iloc [[4]]
A B
12 0.963663 0.383442
Мы можем использовать аналогичный синтаксис для выбора нескольких строк:
#select the 3rd, 4th, and 5th rows of the DataFrame
df.iloc [[2, 3, 4]]
A B
6 0.423655 0.645894
9 0.437587 0.891773
12 0.963663 0.383442
Или мы могли бы выбрать все строки в диапазоне:
#select the 3rd, 4th, and 5th rows of the DataFrame
df.iloc [2:5]
A B
6 0.423655 0.645894
9 0.437587 0.891773
12 0.963663 0.383442
Пример 2. Выбор строк на основе индексации меток
В следующем коде показано, как создать кадр данных pandas и использовать .loc для выбора строки с меткой индекса 3 :
import pandas as pd
import numpy as np
#make this example reproducible
np.random.seed (0)
#create DataFrame
df = pd.DataFrame(np.random.rand (6,2), index=range(0,18,3), columns=['A', 'B'])
#view DataFrame
df
A B
0 0.548814 0.715189
3 0.602763 0.544883
6 0.423655 0.645894
9 0.437587 0.891773
12 0.963663 0.383442
15 0.791725 0.528895
#select the row with index label '3'
df.loc[[3]]
A B
3 0.602763 0.544883
Мы можем использовать аналогичный синтаксис для выбора нескольких строк с разными метками индекса:
#select the rows with index labels '3', '6', and '9'
df.loc[[3, 6, 9]]
A B
3 0.602763 0.544883
6 0.423655 0.645894
9 0.437587 0.891773
Разница между .iloc и .loc
Приведенные выше примеры иллюстрируют тонкую разницу между .iloc и .loc :
- .iloc выбирает строки на основе целочисленного индекса.Итак, если вы хотите выбрать 5-ю строку в DataFrame, вы должны использовать df.iloc[[4]], так как первая строка имеет индекс 0, вторая строка имеет индекс 1 и так далее.
- .loc выбирает строки на основе помеченного индекса.Итак, если вы хотите выбрать строку с меткой индекса 5, вы должны напрямую использовать df.loc[[5]].
Дополнительные ресурсы
Как получить номера строк в кадре данных Pandas
Как удалить строки со значениями NaN в Pandas
Как удалить столбец индекса в Pandas
import
pandas as pd
employees
=
[(
'Stuti'
,
28
,
'Varanasi'
,
20000
),
(
'Saumya'
,
32
,
'Delhi'
,
25000
),
(
'Aaditya'
,
25
,
'Mumbai'
,
40000
),
(
'Saumya'
,
32
,
'Delhi'
,
35000
),
(
'Saumya'
,
32
,
'Delhi'
,
30000
),
(
'Saumya'
,
32
,
'Mumbai'
,
20000
),
(
'Aaditya'
,
40
,
'Dehradun'
,
24000
),
(
'Seema'
,
32
,
'Delhi'
,
70000
)
]
df
=
pd.DataFrame(employees,
columns
=
[
'Name'
,
'Age'
,
'City'
,
'Salary'
])
result
=
df.iloc[
2
]
result
import
pandas as pd
employees
=
[(
'Stuti'
,
28
,
'Varanasi'
,
20000
),
(
'Saumya'
,
32
,
'Delhi'
,
25000
),
(
'Aaditya'
,
25
,
'Mumbai'
,
40000
),
(
'Saumya'
,
32
,
'Delhi'
,
35000
),
(
'Saumya'
,
32
,
'Delhi'
,
30000
),
(
'Saumya'
,
32
,
'Mumbai'
,
20000
),
(
'Aaditya'
,
40
,
'Dehradun'
,
24000
),
(
'Seema'
,
32
,
'Delhi'
,
70000
)
]
df
=
pd.DataFrame(employees,
columns
=
[
'Name'
,
'Age'
,
'City'
,
'Salary'
])
result
=
df.iloc[
2
]
result
I have a dataframe df
:
20060930 10.103 NaN 10.103 7.981
20061231 15.915 NaN 15.915 12.686
20070331 3.196 NaN 3.196 2.710
20070630 7.907 NaN 7.907 6.459
Then I want to select rows with certain sequence numbers which indicated in a list, suppose here is [1,3], then left:
20061231 15.915 NaN 15.915 12.686
20070630 7.907 NaN 7.907 6.459
How or what function can do that?
xxx
1,1531 gold badge11 silver badges23 bronze badges
asked Oct 3, 2013 at 9:36
Use .iloc
for integer based indexing and .loc
for label based indexing. See below example:
ind_list = [1, 3]
df.iloc[ind_list]
legel
2,4593 gold badges23 silver badges22 bronze badges
answered Oct 3, 2013 at 9:43
Woody PrideWoody Pride
13.4k9 gold badges47 silver badges62 bronze badges
4
you can also use iloc:
df.iloc[[1,3],:]
This will not work if the indexes in your dataframe do not correspond to the order of the rows due to prior computations. In that case use:
df.index.isin([1,3])
… as suggested in other responses.
answered Oct 10, 2013 at 12:17
yemuyemu
25.6k10 gold badges32 silver badges29 bronze badges
Another way (although it is a longer code) but it is faster than the above codes. Check it using %timeit function:
df[df.index.isin([1,3])]
PS: You figure out the reason
answered Jan 8, 2019 at 11:14
2
If index_list
contains your desired indices, you can get the dataframe with the desired rows by doing
index_list = [1,2,3,4,5,6]
df.loc[df.index[index_list]]
This is based on the latest documentation as of March 2021.
answered Mar 11, 2021 at 9:13
user42user42
8117 silver badges26 bronze badges
1
For large datasets, it is memory efficient to read only selected rows via the skiprows
parameter.
Example
pred = lambda x: x not in [1, 3]
pd.read_csv("data.csv", skiprows=pred, index_col=0, names=...)
This will now return a DataFrame from a file that skips all rows except 1 and 3.
Details
From the docs:
skiprows
: list-like or integer or callable, defaultNone
…
If callable, the callable function will be evaluated against the row indices, returning True if the row should be skipped and False otherwise. An example of a valid callable argument would be
lambda x: x in [0, 2]
This feature works in version pandas 0.20.0+. See also the corresponding issue and a related post.
answered Jun 20, 2018 at 18:13
pylangpylang
39.7k11 gold badges127 silver badges119 bronze badges
There are many ways of solving this problem, and the ones listed above are the most commonly used ways of achieving the solution. I want to add two more ways, just in case someone is looking for an alternative.
index_list = [1,3]
df.take(pos)
#or
df.query('index in @index_list')
answered Nov 5, 2020 at 3:05
LoochieLoochie
2,38413 silver badges20 bronze badges
2
What you are trying to do is to filter your dataframe by index. The best way to do that in pandas at the moment is the following:
Single Index
desired_index_list = [1,3]
df[df.index.isin(desired_index_list)]
Multiindex
desired_index_list = [1,3]
index_level_to_filter = 0
df[df.index.get_level_values(index_level_to_filter).isin(desired_index_list)]
answered May 27, 2022 at 10:29
JulioJulio
8392 gold badges10 silver badges17 bronze badges
To get a new DataFrame from filtered indexes:
For my problem, I needed a new dataframe from the indexes. I found a straight-forward way to do this:
iloc_list=[1,2,4,8]
df_new = df.filter(items = iloc_list , axis=0)
You can also filter columns using this. Please see the documentation for details.
answered Nov 22, 2022 at 17:17
user3503711user3503711
1,5271 gold badge18 silver badges31 bronze badges
Время чтения 4 мин.
Функция Pandas Dataframe.iloc[] используется, когда метка индекса фрейма данных отличается от числового ряда 0, 1, 2, 3….n или в каком-то сценарии пользователь не знает метку индекса.
Строки можно извлечь, используя воображаемую позицию индекса, которая не отображается в DataFrame.
Содержание
- Что такое функция DataFrame.iloc[]?
- Синтаксис
- Параметры
- Пример iloc[]
- Pandas iloc: передача индекса строки и индекса столбца
- Как выбрать несколько строк с индексом
- Функция iloc[] с объектом Slice
- DataFrame.iloc[] с лямбда-функцией Python
- Логическое индексирование с использованием .iloc
- Заключение
Pandas.DataFrame.iloc — это уникальный встроенный метод, который возвращает индексирование на основе целочисленного местоположения для выбора по положению. Кроме того, метод DataFrame.iloc[] предоставляет способ выбора строк DataFrame. iloc[] в основном основан на целочисленной позиции(от 0 до длины-1 оси), но также может использоваться с булевым массивом.
Pandas.DataFrame.iloc вызовет IndexError, если запрошенный индексатор находится за пределами границ, за исключением индексаторов срезов, которые разрешают индексацию за пределами границ.
Синтаксис
pandas.DataFrame.iloc[row, column] |
Параметры
Допустимые входы:
- Целые числа, например, 5.
- Список или массив целых чисел, например, [4, 3, 0].
- Объект среза с целыми числами, например, 1:7.
- Логический массив.
- Вызываемая функция с аргументом (вызывающая серия или фрейм данных) возвращает допустимые выходные данные для индексации. Это очень полезно в цепочках методов, когда вы не ссылаетесь на вызывающий объект, но хотели бы основывать свой выбор на некоторой логике или значении.
В пользу iloc есть два «аргумента»:
- Селектор строк.
- Селектор столбцов.
Пример.
# Single selections using iloc and DataFrame # Rows: data.iloc[0] # first row of data frame(Aleshia Tomkiewicz) – Note a Series data type output. data.iloc[1] # second row of data frame(Evan Zigomalas) data.iloc[–1] # last row of data frame(Mi Richan) # Columns: data.iloc[:,0] # first column of data frame(first_name) data.iloc[:,1] # second column of data frame(last_name) data.iloc[:,–1] # last column of data frame(id) |
Несколько столбцов и строк можно выбрать с помощью файла .iloc.
# Multiple row and column selections using iloc and DataFrame data.iloc[0:5] # first five rows of dataframe data.iloc[:, 0:2] # first two columns of data frame with all rows data.iloc[[0,3,6,24], [0,5,6]] # 1st, 4th, 7th, 25th row + 1st 6th 7th columns. data.iloc[0:5, 5:8] # first 5 rows and 5th, 6th, 7th columns of data frame(county -> phone1). |
Пример iloc[]
В этом примере мы будем использовать внешний файл CSV. Сначала мы импортируем CSV-файл и читаем его с помощью метода read_csv() в pandas.
Теперь в этом примере мы будем использовать первые 10 записей CSV-файла. Затем мы выберем строки DataFrame, используя метод pandas.DataFrame.iloc[].
# app.py import pandas as pd import numpy as np # reading the data data = pd.read_csv(‘100 Sales Records.csv’, index_col=0) # diplay first 10 rows finalSet = data.head(10) df = pd.DataFrame(finalSet) print(df) |
Выход:
python3 app.py Country Item Type Sales Channel Order Priority Order Date Order ID ... Units Sold Unit Price Unit Cost Total Revenue Total Cost Total Profit Region ... Australia and Oceania Tuvalu Baby Food Offline H 5/28/2010 669165933 ... 9925 255.28 159.42 2533654.00 1582243.50 951410.50 Central America and the Caribbean Grenada Cereal Online C 8/22/2012 963881480 ... 2804 205.70 117.11 576782.80 328376.44 248406.36 Europe Russia Office Supplies Offline L 5/2/2014 341417157 ... 1779 651.21 524.96 1158502.59 933903.84 224598.75 Sub–Saharan Africa Sao Tome and Principe Fruits Online C 6/20/2014 514321792 ... 8102 9.33 6.92 75591.66 56065.84 19525.82 Sub–Saharan Africa Rwanda Office Supplies Offline L 2/1/2013 115456712 ... 5062 651.21 524.96 3296425.02 2657347.52 639077.50 Australia and Oceania Solomon Islands Baby Food Online C 2/4/2015 547995746 ... 2974 255.28 159.42 759202.72 474115.08 285087.64 Sub–Saharan Africa Angola Household Offline M 4/23/2011 135425221 ... 4187 668.27 502.54 2798046.49 2104134.98 693911.51 Sub–Saharan Africa Burkina Faso Vegetables Online H 7/17/2012 871543967 ... 8082 154.06 90.93 1245112.92 734896.26 510216.66 Sub–Saharan Africa Republic of the Congo Personal Care Offline M 7/14/2015 770463311 ... 6070 81.73 56.67 496101.10 343986.90 152114.20 Sub–Saharan Africa Senegal Cereal Online H 4/18/2014 616607081 ... 6593 205.70 117.11 1356180.10 772106.23 584073.87 [10 rows x 13 columns] |
Теперь давайте выберем первую строку DataFrame, используя iloc[0].
# app.py import pandas as pd import numpy as np # reading the data data = pd.read_csv(‘100 Sales Records.csv’, index_col=0) # diplay first 10 rows finalSet = data.head(10) df = pd.DataFrame(finalSet) print(df.iloc[0]) |
Выход:
python3 app.py Country Tuvalu Item Type Baby Food Sales Channel Offline Order Priority H Order Date 5/28/2010 Order ID 669165933 Ship Date 6/27/2010 Units Sold 9925 Unit Price 255.28 Unit Cost 159.42 Total Revenue 2.53365e+06 Total Cost 1.58224e+06 Total Profit 951410 Name: Australia and Oceania, dtype: object |
Pandas iloc: передача индекса строки и индекса столбца
Давайте передадим индекс строки и индекс столбца в метод iloc[]. На выходе мы получим конкретное значение из DataFrame. См. приведенный ниже код.
# app.py import pandas as pd import numpy as np # reading the data series = [(‘Stranger Things’, 3, ‘Millie’), (‘Game of Thrones’, 8, ‘Emilia’),(‘La Casa De Papel’, 4, ‘Sergio’), (‘Westworld’, 3, ‘Evan Rachel’),(‘Stranger Things’, 3, ‘Millie’), (‘La Casa De Papel’, 4, ‘Sergio’)] # Create a DataFrame object dfObj = pd.DataFrame(series, columns=[‘Name’, ‘Seasons’, ‘Actor’]) df = pd.DataFrame(dfObj) print(df.iloc[4, 2]) |
Выход:
pyt python3 app.py Millie(pythonenv) ➜ pyt |
В приведенном выше примере будет выбрано значение, которое находится в 4-й строке и 2-м столбце. Помните, что индекс строки и столбца DataFrame начинается с 0.
В выводе мы получим Millie, потому что 4-я строка — Stranger Things, 3 — Millie, а 2-я колонка — Millie.
Как выбрать несколько строк с индексом
В следующем примере кода сначала извлекается несколько строк путем передачи списка и пропуска целых чисел для выборки строк между этим диапазоном.
См. следующий код.
# app.py import pandas as pd import numpy as np # reading the data data = pd.read_csv(‘100 Sales Records.csv’, index_col=0) # diplay first 10 rows finalSet = data.head(10) df = pd.DataFrame(finalSet) print(df.iloc[[2, 4, 6, 8]]) |
В приведенном выше коде мы передали список индексов в качестве аргумента функции iloc[].
Выход:
python3 app.py Country Item Type Sales Channel Order Priority Order Date Order ID Ship Date Units Sold Unit Price Unit Cost Total Revenue Total Cost Total Profit Region Europe Russia Office Supplies Offline L 5/2/2014 341417157 5/8/2014 1779 651.21 524.96 1158502.59 933903.84 224598.75 Sub–Saharan Africa Rwanda Office Supplies Offline L 2/1/2013 115456712 2/6/2013 5062 651.21 524.96 3296425.02 2657347.52 639077.50 Sub–Saharan Africa Angola Household Offline M 4/23/2011 135425221 4/27/2011 4187 668.27 502.54 2798046.49 2104134.98 693911.51 Sub–Saharan Africa Republic of the Congo Personal Care Offline M 7/14/2015 770463311 8/25/2015 6070 81.73 56.67 496101.10 343986.90 152114.20 |
Функция iloc[] с объектом Slice
Давайте передадим фрагмент Python в качестве индекса и посмотрим на результат.
# app.py import pandas as pd import numpy as np # reading the data data = pd.read_csv(‘100 Sales Records.csv’, index_col=0) # diplay first 10 rows finalSet = data.head(10) df = pd.DataFrame(finalSet) print(df.iloc[3:7]) |
Выход:
python3 app.py Country Item Type Sales Channel Order Priority Order Date Order ID Ship Date Units Sold Unit Price Unit Cost Total Revenue Total Cost Total Profit Region Sub–Saharan Africa Sao Tome and Principe Fruits Online C 6/20/2014 514321792 7/5/2014 8102 9.33 6.92 75591.66 56065.84 19525.82 Sub–Saharan Africa Rwanda Office Supplies Offline L 2/1/2013 115456712 2/6/2013 5062 651.21 524.96 3296425.02 2657347.52 639077.50 Australia and Oceania Solomon Islands Baby Food Online C 2/4/2015 547995746 2/21/2015 2974 255.28 159.42 759202.72 474115.08 285087.64 Sub–Saharan Africa Angola Household Offline M 4/23/2011 135425221 4/27/2011 4187 668.27 502.54 2798046.49 2104134.98 693911.51 |
DataFrame.iloc[] с лямбда-функцией Python
Давайте воспользуемся вызываемой цепочкой методов X, переданной лямбда-функции, которая представляет собой нарезку DataFrame, и выбирает строки с четной меткой индекса.
В этом примере мы не будем использовать внешние данные CSV, а создадим DataFrame из кортежей.
См. следующий код.
# app.py import pandas as pd import numpy as np # reading the data series = [(‘Stranger Things’, 3, ‘Millie’), (‘Game of Thrones’, 8, ‘Emilia’),(‘La Casa De Papel’, 4, ‘Sergio’), (‘Westworld’, 3, ‘Evan Rachel’),(‘Stranger Things’, 3, ‘Millie’), (‘La Casa De Papel’, 4, ‘Sergio’)] # Create a DataFrame object dfObj = pd.DataFrame(series, columns=[‘Name’, ‘Seasons’, ‘Actor’]) df = pd.DataFrame(dfObj) print(df.iloc[lambda x: x.index % 2 == 0]) |
Выход:
python3 app.py Name Seasons Actor 0 Stranger Things 3 Millie 2 La Casa De Papel 4 Sergio 4 Stranger Things 3 Millie |
Вы можете видеть, что он возвращает даже проиндексированные строки. Это связано с тем, что мы передали лямбда-функцию для написания логики, которая удаляет нечетные строки и выбирает четные строки и возвращает их.
Логическое индексирование с использованием .iloc
Давайте передадим список логических значений True и False в метод iloc[] и посмотрим на результат.
# app.py import pandas as pd import numpy as np # reading the data series = [(‘Stranger Things’, 3, ‘Millie’), (‘Game of Thrones’, 8, ‘Emilia’),(‘La Casa De Papel’, 4, ‘Sergio’), (‘Westworld’, 3, ‘Evan Rachel’),(‘Stranger Things’, 3, ‘Millie’), (‘La Casa De Papel’, 4, ‘Sergio’)] # Create a DataFrame object dfObj = pd.DataFrame(series, columns=[‘Name’, ‘Seasons’, ‘Actor’]) df = pd.DataFrame(dfObj) print(df.iloc[[True, True, True, True, False, False]]) |
Выход:
python3 app.py Name Seasons Actor 0 Stranger Things 3 Millie 1 Game of Thrones 8 Emilia 2 La Casa De Papel 4 Sergio 3 Westworld 3 Evan Rachel |
Заключение
Существует множество способов выбора и индексации строк и столбцов из Pandas DataFrames.
- Выбор данных по номерам строк (.iloc).
- Выбор данных по метке или по условному оператору (.loc)
Сегодня мы рассмотрели только метод iloc[].
Синтаксис iloc — это data.iloc[<row selection>, <column selection>], что наверняка вызовет путаницу у R-пользователей. «iloc» в pandas используется для выбора строк и столбцов по номеру (индексу) в том порядке, в котором они появляются в DataFrame.
Вы можете представить, что каждая строка имеет номер строки от 0 до общего количества строк(data.shape[0]), и iloc[] позволяет выбирать на основе этих номеров. То же самое относится и к столбцам(от 0 до data.shape[1]).
Чтобы получить конкретную строку в DataFrame с помощью индекса, используйте свойство iloc и укажите индекс строки в квадратных скобках.
DataFrame.iloc[row_index]
DataFrame.iloc возвращает строку, как объект Series.
Пример 1
В этом примере мы будем:
- Инициализировать DataFrame некоторыми числами.
- Получать конкретную строку (индекс = 1) с помощью свойства DataFrame.iloc.
import pandas as pd import numpy as np df = pd.DataFrame( [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']]) row = df.iloc[1] #index=1 => second row print(row)
Вывод:
0 d 1 e 2 f Name: 1, dtype: object
На выходе: 0, 1 и 2 – индекс столбца, а d, e, f – строка.
Заключение
В этом руководстве на примерах Python мы узнали, как получить конкретную строку из Pandas DataFrame с помощью свойства DataFrame.iloc.
This div height required for enabling the sticky sidebar