programing

팬더 Data Frame을 되돌리는 올바른 방법?

sourcetip 2023. 1. 30. 22:55
반응형

팬더 Data Frame을 되돌리는 올바른 방법?

코드는 다음과 같습니다.

import pandas as pd

data = pd.DataFrame({'Odd':[1,3,5,6,7,9], 'Even':[0,2,4,6,8,10]})

for i in reversed(data):
    print(data['Odd'], data['Even'])

이 코드를 실행하면 다음 오류가 나타납니다.

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 665, in _get_item_cache
    return cache[item]
KeyError: 5

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\*****\Documents\******\********\****.py", line 5, in <module>
    for i in reversed(data):
  File "C:\Python33\lib\site-packages\pandas\core\frame.py", line 2003, in __getitem__
    return self._get_item_cache(key)
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 667, in _get_item_cache
    values = self._data.get(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1656, in get
    _, block = self._find_block(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1936, in _find_block
    self._check_have(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1943, in _check_have
    raise KeyError('no item named %s' % com.pprint_thing(item))
KeyError: 'no item named 5'

이 에러가 발생하는 이유는 무엇입니까?
어떻게 하면 고칠 수 있을까요?
되돌리는 올바른 방법은 무엇입니까?pandas.DataFrame?

data.reindex(index=data.index[::-1])

또는 단순하게:

data.iloc[::-1]

데이터 프레임을 반전시킵니다.for루프가 다운에서 업으로 이동하면 다음과 같이 할 수 있습니다.

for idx in reversed(data.index):
    print(idx, data.loc[idx, 'Even'], data.loc[idx, 'Odd'])

또는

for idx in reversed(data.index):
    print(idx, data.Even[idx], data.Odd[idx])

에러가 발생하고 있는 것은,reversed첫 번째 콜data.__len__()6이 반환됩니다.그 후, 콜을 시도합니다.data[j - 1]위해서jrange(6, 0, -1)첫 번째 콜은data[5]팬더 데이터 프레임에서는data[5]5열을 의미하며 5열이 없으므로 예외가 발생합니다.( "docs" 참조)

보다 간단한 방법으로 행을 반전할 수 있습니다.

df[::-1]

팬더 데이터 프레임을 되돌리는 올바른 방법은 무엇입니까?

TL;DR:df[::-1]

이것은 DataFrame을 반전시키는 가장 좋은 방법입니다.1) 고정 실행 시간, 즉 O(1) 2) 단일 작업, 3) 간결/가독 가능(슬라이스 표기법에 익숙하다고 가정).


롱 버전

나는 ol' 슬라이스 트릭(또는 이에 상당하는 것)이 Data Frame을 되돌리는 가장 간결하고 관용적인 방법이라는 것을 알았다.이것은 python 목록 반전 구문을 반영합니다.lst[::-1]그리고 그 의도가 명확합니다.를 사용하여loc필요에 따라 열을 슬라이스할 수도 있기 때문에 조금 더 유연합니다.

인덱스를 처리할 때 고려해야 할 몇 가지 사항:

  • "지수를 되돌리려면 어떻게 해야 하나요?"

    • 넌 이미 끝났어 df[::-1]는 인덱스와 값을 모두 반전시킵니다.
  • "결과에서 지수를 떨어뜨리려면 어떻게 해야 합니까?"

    • 마지막에 전화하시면 됩니다.
  • 인덱스를 변경하지 않고 유지하려면(IOW, 인덱스가 아닌 데이터만 반전) 어떻게 해야 합니까?

    • 이것은 지수가 데이터와 관련이 없다는 것을 의미하기 때문에 다소 관례적이지 않다.완전히 제거하는 것을 고려해 보시겠습니까?당신이 요구하는 것은 기술적으로 다음 중 하나를 사용하여 달성할 수 있지만,df[:] = df[::-1]이 명령어를 통해 임플레이스 업데이트가 생성됩니다.df, 또는df.loc[::-1].set_index(df.index)복사본을 반환합니다.

1:df.loc[::-1]그리고.df.iloc[::-1]슬라이싱 구문이 동일하기 때문에 위치별로 반전하는 경우에도 동일합니다(iloc또는 라벨(loc).


증명은 푸딩 안에 있다

여기에 이미지 설명 입력

X축은 데이터 집합 크기를 나타냅니다.Y축은 반전하는 데 걸린 시간을 나타냅니다.슬라이스 트릭과 같은 스케일링 방법은 없습니다.그래프 하단에 표시됩니다.참조용 벤치마크 코드, 성능도를 사용하여 생성된 그림입니다.


기타 솔루션에 대한 코멘트

  • df.reindex(index=df.index[::-1])확실히 인기 있는 솔루션이지만, 언뜻 보면, 이 코드가 「데이터 프레임을 되돌리고 있다」라고 하는 것은, 익숙하지 않은 독자에게는 얼마나 분명한 것일까요.시켜, 그를 「」, 「」, 「」, 「」, 「」로 사용합니다.reindex즉, 이것은 본질적으로 2단계 작업입니다(단 1단계일 수도 있었을 때).

  • df.sort_index(ascending=False)단순한 범위 인덱스를 사용하는 대부분의 경우 사용할 수 있지만 인덱스가 오름차순으로 정렬되어 있기 때문에 일반화가 잘 되지 않는다고 가정합니다.

  • ★★★★★★★★★★는 사용하지 말아 주세요.iterrows. 역방향으로 반복하는 옵션이 몇 개 보입니다.사용 사례에 관계없이 벡터화된 방법이 있을 수 있지만 없다면 목록 통합과 같은 좀 더 합리적인 방법을 사용할 수 있습니다.그 이유에 대한 자세한 내용은 Panda의 DataFrame에서 행을 반복하는 방법을 참조하십시오.iterrows척점입입니니다

기존 응답 중 어느 것도 데이터 프레임을 반전시킨 후 인덱스를 리셋하지 않습니다.

이를 위해 다음 작업을 수행합니다.

 data[::-1].reset_index()

다음은 @Tim의 코멘트에 따라 오래된 인덱스 컬럼도 삭제하는 유틸리티 함수입니다.

def reset_my_index(df):
  res = df[::-1].reset_index(drop=True)
  return(res)

데이터 프레임을 함수에 전달하기만 하면 됩니다.

정렬된 범위 인덱스를 처리하는 경우 이를 수행하는 한 가지 방법은 다음과 같습니다.

data = data.sort_index(ascending=False)

이 접근방식은 (1) 단일 라인이며 (2) 효용 함수를 필요로 하지 않으며 (3) 데이터 프레임의 데이터를 실제로 변경하지 않는다는 장점이 있다.

주의: 이것은 인덱스를 내림차순으로 정렬함으로써 작동하므로 특정 데이터 프레임에 대해 항상 적절하거나 일반화되지 않을 수 있습니다.

이 방법은 다음과 같습니다.

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])

언급URL : https://stackoverflow.com/questions/20444087/right-way-to-reverse-a-pandas-dataframe

반응형