Панди кожен n-й ряд


108

Dataframe.resample () працює лише з даними часових рядів. Я не можу знайти спосіб отримати кожен n-й рядок з даних, що не належать до серії. Який найкращий метод?

Відповіді:


201

Я б використовував iloc, що приймає фрагмент рядка / стовпця, як на основі цілочисельної позиції, так і після нормального синтаксису python.

df.iloc[::5, :]

46
Для тих, хто, можливо, захоче, наприклад, кожен п'ятий ряд, але починаючи з 2-го ряду це буде df.iloc[1::5, :].
Маленькі столи Боббі

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.


6
це не є гарною відповіддю, оскільки робиться три припущення, які часто не виконуються: (1) індекс є числовим (2) індекс, який починається з нуля (3) значення індексу є послідовними ... останнє особливо важливо оскільки ви не можете використовувати запропонований метод більше одного разу без скидання індексу
Костянтин,

1
Я розумію вашу думку. Відредагує відповідь, щоб зробити припущення більш чіткими .
метастабільнийB

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

1

У мене була подібна вимога, але я хотів, щоб я посів п’ятий предмет у певній групі. Ось як я це вирішив.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.