Dataframe.resample () работает только с данными таймсерий. Я не могу найти способ получить каждую n-ю строку из данных вне таймсерий. Какой лучший метод?
Ответы:
Я бы использовал iloc
, который занимает срез строки / столбца, как на основе целочисленной позиции, так и в соответствии с обычным синтаксисом Python.
df.iloc[::5, :]
df.iloc[::5]
Хотя принятый ответ @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.
Существует еще более простое решение принятого ответа, которое включает прямой вызов 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
df.iloc[1::5, :]
.