Панды каждую n-ю строку

109

Dataframe.resample () работает только с данными таймсерий. Я не могу найти способ получить каждую n-ю строку из данных вне таймсерий. Какой лучший метод?

Миксель
источник

Ответы:

203

Я бы использовал iloc, который занимает срез строки / столбца, как на основе целочисленной позиции, так и в соответствии с обычным синтаксисом Python.

df.iloc[::5, :]
chrisb
источник
46
Для тех, кто хочет, например, каждую пятую строку, но начиная со 2-й строки будет df.iloc[1::5, :].
Little Bobby Tables,
17
Вы можете опустить колонку:df.iloc[::5]
joctee
1
@chrisb как мне указать начальную строку? как каждые 5 рядов, начиная со второго ряда?
FabioSpaghetti,
30

Хотя принятый ответ @chrisb действительно отвечает на вопрос, я хотел бы добавить к нему следующее.

Вот простой метод, который я использую для получения nthданных или удаления nthстроки:

df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0

Эта выборка, основанная на арифметических операциях, позволяет выполнять даже более сложный выбор строк.

При этом , конечно, предполагается , что у вас есть indexстолбец упорядоченных последовательных целых чисел, начинающихся с 0.

метастабильныйB
источник
6
это не лучший ответ, потому что он делает три допущения, которые часто не выполняются: (1) индекс является числовым (2) индекс начинается с нуля (3) значения индекса являются последовательными ... последнее особенно важно поскольку вы не можете использовать предложенный метод более одного раза без сброса индекса
Константин
1
Я понимаю вашу точку зрения. Отредактирую ответ, чтобы сделать предположения более явными .
metastableB
1
@Constantine все же, разве это не будет быстрее, чем другое решение, поскольку вы можете просто добавить индекс?
Ридлер
8

Существует еще более простое решение принятого ответа, которое включает прямой вызов df.__getitem__.

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

Например, чтобы получить каждые 2 строки, вы можете сделать

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x

Также есть GroupBy.first/ GroupBy.head, вы группируете по индексу:

df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

Индекс делится на пол шагом (в данном случае 2). Если индекс не является числовым, вместо этого выполните

# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
cs95
источник
1

У меня было аналогичное требование, но я хотел, чтобы n-й элемент в определенной группе. Вот как я это решил.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Steztric
источник