Как выделить (разрезать) в Pandas несколько строк и несколько не непрерывных столбцов? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть dataFrame, и я хочу диапазон определенных строк и в то же время диапазон, который составлен из непрерывного диапазона столбцов плюс дополнительный.Включен фрагмент кода, который создает такой фрейм данных

import pandas as pd 
import numpy as np
np.random.seed(5)
dF = pd.DataFrame(np.random.randint(100, size=(100, 6)), 
              columns=list('ABCDEF'), 
              index=['R{}'.format(i) for i in range(100)])
dF.head()

Это прекрасно работает:

dF.loc[:, 'C':'E']

Но мне нужно что-то вроде этого, которое выдает ошибку:

dF.loc['R95':, ['A':'C', 'F']]

Ожидаемый результат должен включать начиная со строки «R95» и столбцов «A», «C» и «F»

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Индексация панд позволяет индексировать фрейм данных (цитирование из документов) следующими способами:

  • Одна метка, например 5 или 'a' (обратите внимание, что 5 интерпретируется как метка индекса. Это использование не является целочисленной позицией вдоль индекса.).
  • Список или массив меток ['a', 'b', 'c'].
  • Объект среза с метками 'a': 'f' (Обратите внимание, что в отличие от обычных срезов питона, в начало и конец включены, когда они присутствуют в индексе! См. Нарезка с метками.).
  • логический массив
  • Вызываемая функция с одним аргументом (вызывающая серия, DataFrame или Panel), которая возвращает действительный вывод для индексации (один из указанных выше).

Так что вам нужно использовать что-то более сложное.

Например, вы можете использовать pandas.concat , чтобы выбрать столбцы по отдельности, а затем соединить вместе кадры данных:

pd.concat([dF.loc['R95':, 'A':'C'], dF.loc['R95':,'F']], axis=1)

Это дает:

      A   B   C   F
R95  19   7  76   0
R96  57  31  86  64
R97  51  12  59  33
R98  24   7  68  69
R99  81  20  86  70
1 голос
/ 31 мая 2019

Если вы можете просто использовать индекс, который вы можете сделать:

dF.iloc[95:, np.r_[0:3, -1]]

    A   B   C   F
R95 19  7   76  0
R96 57  31  86  64
R97 51  12  59  33
R98 24  7   68  69
R99 81  20  86  70

, который намного чище.

0 голосов
/ 31 мая 2019

Это уродливое решение, но в нем все еще есть двоеточие

df.loc['R95':, df.loc[:,'A':'C'].columns.tolist()+['F']]
...