Python Pandas - Как получить (iloc) позицию одной или нескольких отфильтрованных строк в кадре данных - PullRequest
0 голосов
/ 16 сентября 2018

Используя этот пример

df = pd.DataFrame({'letters': 
                  ['A', 'B', 'C', 'D', 'E', 'F']},
                  index=[10, 20, 30, 40, 50, 30])

С df.iloc [x] я могу получить строку x в кадре данных. Например.

df.iloc[3]

возвращает

буквы D Имя: 40, тип: объект

Когда я фильтрую кадр данных, как

df2 = df.iloc[1:3]

Я получаю за df2

    letters
20  B
30  C

Теперь предположим, что я не знал, как был применен фильтр, и мне нужно выяснить значения для отфильтрованных строк (1 и 2).

Какой лучший способ получить список позиций, позволяющий мне получить доступ к отфильтрованному результату, как этот результат, через исходный фрейм данных, используя df.iloc ? Как мне получить номера позиций?

Я ищу результат

[1, 2]

Примечание: у меня было хорошее предложение:

df.index.get_indexer_for((df2.index))

, который не работает, если индекс не уникален.

Int64Index([1, 2, 5], dtype='int64')

1 Ответ

0 голосов
/ 16 сентября 2018

Поскольку мы должны также включить значение, если мы хотим обрабатывать такие случаи, как df.iloc[[1,5]], где вам нужно получить 5 из "30 F", я думаю, что самый простой способ - использовать слияние:

In [172]: df.reset_index().reset_index().merge(df.iloc[1:3].reset_index())
Out[172]: 
   level_0  index letters
0        1     20       B
1        2     30       C

In [173]: df.reset_index().reset_index().merge(df.iloc[1:3].reset_index())["level_0"].values
Out[173]: array([1, 2], dtype=int64)

In [174]: df.reset_index().reset_index().merge(df.iloc[[1,5]].reset_index())
Out[174]: 
   level_0  index letters
0        1     20       B
1        5     30       F

In [175]: df.reset_index().reset_index().merge(df.iloc[[1,5]].reset_index())["level_0"].values
Out[175]: array([1, 5], dtype=int64)

В случае, если невозможно восстановить уникальные исходные позиции из-за дублирования строк, вы получите все из них:

In [179]: df.iloc[-1, 0] = "C"

In [180]: df.reset_index().reset_index().merge(df.iloc[[1,2]].reset_index())
Out[180]: 
   level_0  index letters
0        1     20       B
1        2     30       C
2        5     30       C

In [181]: df.reset_index().reset_index().merge(df.iloc[[1,2]].reset_index())["level_0"].values
Out[181]: array([1, 2, 5], dtype=int64)

но вы можете решить, как вы хотите удалить дубликаты после слияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...