Извлечь диапазон строк с помощью .between () и заданных c столбцов, из Pandas DataFrame? - PullRequest
0 голосов
/ 10 апреля 2020

Я только что запутался в этом: рассмотрим этот пример:

>>> import pandas as pd
>>>
df = pd.DataFrame({
  "key":[1,3,6,10,15,21],
  "columnA":[10,20,30,40,50,60],
  "columnB":[100,200,300,400,500,600],
  "columnC":[110,202,330,404,550,606],
})

>>> df
   key  columnA  columnB  columnC
0    1       10      100      110
1    3       20      200      202
2    6       30      300      330
3   10       40      400      404
4   15       50      500      550
5   21       60      600      606

Итак, я хочу извлечь данные из этой таблицы, где столбец key (предположим, он растет монотонно) лежит между двумя значениями ( скажем, 2 и 15) - но только для некоторых определенных c столбцов (скажем, "columnA" и "column C". Надеюсь, это можно сделать в одну строку.

Теперь, если Я хочу использовать метод .between() - он в основном возвращает истину / ложь для всех строк:

>>> df['key'].between(2, 16)
0    False
1     True
2     True
3     True
4     True
5    False

Итак, чтобы фактически извлечь эти строки, мне нужно поместить вышеуказанную команду в квадратные скобки:

>>> df[df['key'].between(2, 16)]
   key  columnA  columnB  columnC
1    3       20      200      202
2    6       30      300      330
3   10       40      400      404
4   15       50      500      550

Отлично, это то, что мне нужно - мне просто нужно ограничить столбцы, поэтому я попробую это:

>>> df[df['key'].between(2, 16), ["columnA"]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/msys64/mingw64/lib/python3.8/site-packages/pandas/core/frame.py", line 2800, in __getitem__
    indexer = self.columns.get_loc(key)
  File "C:/msys64/mingw64/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 2646, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/index.pyx", line 111, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 116, in pandas._libs.index.IndexEngine.get_loc
TypeError: '(0    False
1     True
2     True
3     True
4     True
5    False
Name: key, dtype: bool, ['columnA'])' is an invalid key

Э-э ... без кубиков.

Итак, как я могу сделать выше, и ограничить указанные c столбцы?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы можете просто использовать стандартный способ нарезки фреймов данных:

df[df['key'].between(2,16)][['key','columnA','columnC']]
0 голосов
/ 10 апреля 2020

Ну, получается, мне нужно использовать .loc:

>>> df.loc[df['key'].between(2, 16), ["columnA"]]
   columnA
1       20
2       30
3       40
4       50

... точнее, как я изначально хотел (а также добавив столбец "ключ"):

>>> df.loc[df['key'].between(2, 16), ["key", "columnA", "columnC"]]
   key  columnA  columnC
1    3       20      202
2    6       30      330
3   10       40      404
4   15       50      550
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...