Подтвердить что ты не робот

Pandas каждая n-я строка

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

4b9b3361

Ответ 1

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

df.iloc[::5, :]

Ответ 2

Хотя @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.

Ответ 3

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

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]

Ответ 4

Существует еще более простое решение для принятого ответа, которое включает прямой 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