팬더 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]
위해서j
에range(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
'programing' 카테고리의 다른 글
Java, Classpath, Classloading => 동일한 jar/프로젝트의 여러 버전 (0) | 2023.01.30 |
---|---|
Array List를 셔플하는 방법 (0) | 2023.01.30 |
'DBNAME.hibernate_sequence' 테이블이 존재하지 않습니다. (0) | 2023.01.30 |
Flask for Python을 사용하여 방문자의 IP 주소 가져오기 (0) | 2023.01.30 |
Axios를 사용하여 Blob으로 저장되는 POST 이미지 - VUEJS (0) | 2023.01.30 |