n 번째 행마다 판다


109

Dataframe.resample ()은 시계열 데이터에서만 작동합니다. 비 시계열 데이터에서 모든 n 번째 행을 얻는 방법을 찾을 수 없습니다. 가장 좋은 방법은 무엇입니까?

답변:


203

iloc정수 위치를 기반으로하고 일반 파이썬 구문을 따르는 행 / 열 슬라이스를 사용 하는을 사용 합니다.

df.iloc[::5, :]

46
예를 들어 5 번째 줄마다 원하지만 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

이 산술 기반 샘플링에는 훨씬 더 복잡한 행 선택을 가능하게하는 기능이 있습니다.

물론 이것은 0에서 시작 하는 순서가 있고 연속적인 정수 열 이 있다고 가정합니다 .index


6
자주 충족되지 않는 세 가지 가정을하기 때문에 이것은 좋은 대답이 아닙니다. (1) 인덱스가 숫자입니다. (2) 인덱스가 0에서 시작합니다. 당신은 인덱스를 재설정하지 않고 두 번 이상 당신의 제안 방법을 사용할 수 없기 때문에
콘스탄틴

1
나는 당신의 요점을 받아들입니다. 가정을 보다 명시 적으로 만들기 위해 대답을 편집합니다 .
metastableB

1
@Constantine은 여전히 ​​색인을 추가 할 수 있으므로 다른 솔루션보다 빠르지 않습니까?
Readler

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

비슷한 요구 사항이 있었지만 특정 그룹의 n 번째 항목을 원했습니다. 이것이 내가 그것을 해결 한 방법입니다.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.