[Python Fennel Bean 시리즈] PANDAS DataFrame의 모든 행을 순회하는 방법

[Python Fennel Bean 시리즈] PANDAS DataFrame의 모든 행을 순회하는 방법

Python으로 프로그래밍할 때 동일한 목표를 달성하기 위해 다른 방법을 사용하는 것이 때로는 흥미로울 수 있습니다. 루쉰의 쿵이지(Kong Yiji)가 생각난다. 공이지(Kong Yiji)는 회향콩에 회향이라는 단어를 쓰는 네 가지 방법에 대해 많은 연구를 했습니다. 나는 감히 Kong Yiji와 비교할 수 없으므로 여기에서는 모든 코더의 즐거움을 위해 Python 회향 콩을 수집합니다.

먼저 테스트용 DataFrame을 생성하는 함수를 준비합니다. 이 DataFrame에는 a, b, c라는 3개의 열이 있습니다.

>>> import numpy as np
>>> import pandas as pd
>>>
>>> df = pd.DataFrame({
    
    'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
>>> df
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9

BOSS의 요구 사항은 각 줄에 a와 b를 인쇄하는 것입니다. 예를 들면 다음과 같습니다.

1 4
2 5
3 6

茴香豆一: iterrows

DataFrame에는 모든 행을 반복하는 데 특별히 사용되는 함수가 있습니다.

>>> for index, row in df.iterrows():
>>>    print(row['a'], row['b'])
1 4
2 5
3 6

이 기능은 간단하고 명확하며 좋아 보이지만 치명적인 약점이 있습니다. 일반적으로
속도가 느리고 줄 수가 많으면 인생을 의심하게 만듭니다.

회향 콩 2: 반복

iterrows에는 DataFrame을 명명된 튜플로 변환할 수 있는 형제 itertuple이 있습니다. 이는 더 빠릅니다.

>>> for row in df.itertuples(index=True, name='hxd'):
>>>    print(row.a, row.b)
1 4
2 5
3 6

물론 골드 같은 건 없고 사용할 때 주의할 점이 있는데 가장 중요한 것은 DataFrame의 열 이름에 Python 예약어가 포함되어 있으면 열 이름이 자동으로 변환된다는 점입니다. 예:

>>> df = pd.DataFrame({
    
    'in':[1,2,33], 'b':[4,5,6], 'c':[7,8,9]})
>>> for row in df.itertuples(name='hxd'):
>>>    print(row)
hxd(Index=0, _1=1, b=4, c=7)
hxd(Index=1, _1=2, b=5, c=8)
hxd(Index=2, _1=33, b=6, c=9)

이 예에서는 inPython의 예약어이며 자동으로 로 변경됩니다 _1.

회향 콩 3: iloc

이건 좀, 음, 좀 서투르지만 영리해요.

>>> for i in range(0, len(df)):
>>>    print (df.iloc[i]['a'], df.iloc[i]['b'])
1 4
2 5
3 6

회향콩 4개: to_***

to_DataFrame은 처음에 많은 함수를 가지고 있는데 , 이러한 함수를 통해 DataFrame을 다른 형태로 변환한 후
처리할 수 있으며, 이를 통해 다음과 같은 많은 메소드를 도출할 수 있다.

>>> for row in df.to_dict(orient='records'):
>>>    print(row['a'], row['b'])

물론 DataFrame에도 to_로 시작하는 다양한 메소드가 있으니 관심 있는 친구들은 시도해 볼 수도 있습니다.

Fennel Bean Five: 순회 없음

사실, 때때로 우리는 BOSS의 요청을 거절하는 법을 배워야 합니다. 물론 거절하는 방법은 기술이며 이 기사의 범위를 벗어납니다.

DataFrame의 내용만 표시하려면 다음 방법으로 충분합니다.

>>> print(df[['a', 'b']].to_string(index=False, header=False))
1  4
2  5
3  6

각 데이터 행을 계산하려면 각 데이터 행을 순회하는 대신 Pandas에서 제공하는 함수나 계산 방법을 사용해야 합니다.
이는 Pandas 함수가 벡터화되어 있으며 처리 효율성이 순회보다 훨씬 높기 때문입니다. 예는 다음과 같습니다:

df = pd.DataFrame(np.random.randn(100000, 4), columns=list('abcd'))
timeit [row.a + row.b for row in df.itertuples(index=False)]
72 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
timeit [x+y for x,y in zip(df['a'], df['b'])]
20.3 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit df['a'] + df['b']
1.27 ms ± 83.2 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

위의 예에서 볼 수 있듯이 순회가 가장 느리고 목록 파생이 그 뒤를 따르며, pandas가 가장 빠릅니다.
사실 그 이유는 아주 간단합니다. 전문적인 일은 전문가에게 맡기고 하지 마세요.

Guess you like

Origin blog.csdn.net/mouse2018/article/details/113705723