Как найти строку по индексу pandas

  • Редакция Кодкампа

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's user avatar

xxx

1,1531 gold badge11 silver badges23 bronze badges

asked Oct 3, 2013 at 9:36

user2806761's user avatar

Use .iloc for integer based indexing and .loc for label based indexing. See below example:

ind_list = [1, 3]
df.iloc[ind_list]

legel's user avatar

legel

2,4593 gold badges23 silver badges22 bronze badges

answered Oct 3, 2013 at 9:43

Woody Pride's user avatar

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.

Community's user avatar

answered Oct 10, 2013 at 12:17

yemu's user avatar

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

enter image description here

Community's user avatar

answered Jan 8, 2019 at 11:14

Amruth Lakkavaram's user avatar

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

user42's user avatar

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, default None

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.

Community's user avatar

answered Jun 20, 2018 at 18:13

pylang's user avatar

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

Loochie's user avatar

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

Julio's user avatar

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

user3503711's user avatar

user3503711user3503711

1,5271 gold badge18 silver badges31 bronze badges

Время чтения 4 мин.

Функция Pandas Dataframe.iloc[] используется, когда метка индекса фрейма данных отличается от числового ряда 0, 1, 2, 3….n или в каком-то сценарии пользователь не знает метку индекса.

Строки можно извлечь, используя воображаемую позицию индекса, которая не отображается в DataFrame.

Содержание

  1. Что такое функция DataFrame.iloc[]?
  2. Синтаксис
  3. Параметры
  4. Пример iloc[]
  5. Pandas iloc: передача индекса строки и индекса столбца
  6. Как выбрать несколько строк с индексом
  7. Функция iloc[] с объектом Slice
  8. DataFrame.iloc[] с лямбда-функцией Python
  9. Логическое индексирование с использованием .iloc
  10. Заключение

Pandas.DataFrame.iloc — это уникальный встроенный метод, который возвращает индексирование на основе целочисленного местоположения для выбора по положению. Кроме того, метод DataFrame.iloc[] предоставляет способ выбора строк DataFrame. iloc[] в основном основан на целочисленной позиции(от 0 до длины-1 оси), но также может использоваться с булевым массивом.

Pandas.DataFrame.iloc вызовет IndexError, если запрошенный индексатор находится за пределами границ, за исключением индексаторов срезов, которые разрешают индексацию за пределами границ.

Функция Python Pandas iloc

Синтаксис

pandas.DataFrame.iloc[row, column]

Параметры

Допустимые входы:

  1. Целые числа, например, 5.
  2. Список или массив целых чисел, например, [4, 3, 0].
  3. Объект среза с целыми числами, например, 1:7.
  4. Логический массив.
  5. Вызываемая функция с аргументом (вызывающая серия или фрейм данных) возвращает допустимые выходные данные для индексации. Это очень полезно в цепочках методов, когда вы не ссылаетесь на вызывающий объект, но хотели бы основывать свой выбор на некоторой логике или значении.

В пользу iloc есть два «аргумента»:

  1. Селектор строк.
  2. Селектор столбцов.

Пример.

# 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

SubSaharan Africa                 Sao Tome and Principe           Fruits        Online              C  6/20/2014  514321792  ...       8102        9.33       6.92       75591.66    56065.84      19525.82

SubSaharan 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

SubSaharan Africa                                Angola        Household       Offline              M  4/23/2011  135425221  ...       4187      668.27     502.54     2798046.49  2104134.98     693911.51

SubSaharan Africa                          Burkina Faso       Vegetables        Online              H  7/17/2012  871543967  ...       8082      154.06      90.93     1245112.92   734896.26     510216.66

SubSaharan Africa                 Republic of the Congo    Personal Care       Offline              M  7/14/2015  770463311  ...       6070       81.73      56.67      496101.10   343986.90     152114.20

SubSaharan 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

SubSaharan Africa                 Rwanda  Office Supplies       Offline              L   2/1/2013  115456712   2/6/2013        5062      651.21     524.96     3296425.02  2657347.52     639077.50

SubSaharan Africa                 Angola        Household       Offline              M  4/23/2011  135425221  4/27/2011        4187      668.27     502.54     2798046.49  2104134.98     693911.51

SubSaharan 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

SubSaharan 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

SubSaharan 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

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

  1. Выбор данных по номерам строк (.iloc).
  2. Выбор данных по метке или по условному оператору (.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

Добавить комментарий