programing

매 n번째 줄 팬더

powerit 2023. 11. 4. 13:22
반응형

매 n번째 줄 팬더

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

사용합니다.iloc, 이것은 정수 위치와 일반적인 파이썬 구문을 따르는 행/열 슬라이스를 사용합니다.5번째 행마다 원하는 경우:

df.iloc[::5, :]

@chrisb의 수락된 답변이 질문에 답을 주지만, 저는 여기에 다음과 같이 덧붙이고 싶습니다.

내가 사용하는 간단한 방법은nthdata 또는 drop thenth행은 다음과 같습니다.

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

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

는 물론, 당신이 그들과index0에서 시작하는 순서가 매겨진, 연속된, 정수의 열.

직접 호출하는 것을 포함하는 수락된 답변에 대한 훨씬 더 간단한 해결책이 있습니다.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.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

추가하기reset_index()에서 준안정 B의을 사용하면 행이 순서대로 연속되어 있다고 가정할 수 있습니다.

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

df.reset_index().index는 0에서 시작하여 1씩 증가하는 인덱스를 생성하므로 모듈로를 쉽게 사용할 수 있습니다.

저도 비슷한 요구사항이 있었는데, 특정 그룹의 물건이 아니길 원했습니다.이렇게 풀었어요.

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

인덱스를 사용할 때 생각해낸 솔루션이 실행 가능하지 않았습니다(multi-Gig.csv가 너무 크거나 충돌 없이 재인덱스할 수 있는 기술을 놓쳤을 수 있습니다).
한 번에 하나의 행을 걷고 n번째 행을 새 데이터 프레임에 추가합니다.

import pandas as pd
from csv import DictReader

def make_downsampled_df(filename, interval):    
    with open(filename, 'r') as read_obj:
        csv_dict_reader = DictReader(read_obj)
        column_names = csv_dict_reader.fieldnames
        df = pd.DataFrame(columns=column_names)
    
        for index, row in enumerate(csv_dict_reader):
            if index % interval == 0:
               print(str(row))
               df = df.append(row, ignore_index=True)

    return df
df.drop(labels=df[df.index % 3 != 0].index, axis=0) #  every 3rd row (mod 3)

언급URL : https://stackoverflow.com/questions/25055712/pandas-every-nth-row

반응형