pandas.DataFrame을 뒤집는 올바른 방법?


117

내 코드는 다음과 같습니다.

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?


3
어떤 결과물을 찾고 있습니까? "One"의 열없는 data, 그리고 나도 몰라 Two변수 나에 대한 오타 "Two"도 열 수 없습니다. 열 순서를 바꾸려고하십니까?
DSM

data[["Odd", "Even"]]또는보다 일반적 으로을 (를) 의미 했습니까 data[data.columns[::-1]]?
Fred Foo

1
원하는 출력의 예를 아직 제공하지 않았습니다. 사실 reversed(data)이 작동하지 않는 것을 피하는 방법을 알고 있지만 프레임의 각 열에 대해 전체 OddEven열을 한 번씩 인쇄하려는 이유를 모르겠습니다 reversed(list(data)).
DSM

내 dataFrame의 끝에서 for 루프를 시작하고 싶습니다
Michael

2
그럼 난 당신의 질문의 DUP 생각 이 하나 , 당신은 뭔가를 원하는 for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. 기대하는 결과물에 대한 질문에 항상 예를 ​​들어주십시오. 모든 사람의 삶을 훨씬 쉽게 만듭니다.
DSM

답변:


247
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가 없으므로 예외가 발생합니다. ( 문서 참조 )


: 당신은 문제가있는 경우이 시도 할 수 있습니다for index, row in df.iloc[::-1].iterrows():
크리스티안

제자리에서 할 방법이 있습니까? 가상의 동등한data.reindex(index=data.index[::-1], inplace=True)
NeuronQ

3
data = data.reindex(index=data.index[::-1])그러면 할 수 data.reset_index(inplace=True, drop=True)있으며 제자리에서 재설정됩니다.
Matts

4
df = df[::-1]파이썬 유효한 해결책은?
tommy.carstensen

@ tommy.carstensen 예, 그리고 상단의 대답해야한다
rosstripi

66

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

df[::-1]

4
reverse()메서드를 pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]연결할 때 더 좋아 보이기 때문에 내 자신의 메서드 를 정의하고 싶습니다 df.reverse().iterrows().
Ben Mares

5

기존 답변 중 어느 것도 데이터 프레임을 뒤집은 후 인덱스를 재설정하지 않습니다.

이를 위해 다음을 수행하십시오.

 data[::-1].reset_index()

@Tim의 주석에 따라 이전 인덱스 열도 제거 하는 유틸리티 함수 는 다음과 같습니다 .

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

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


1
drop=True, 즉 :를 원할 것입니다 . data[::-1].reset_index(drop=True)그렇지 않으면 이전 인덱스가 DataFrame의 열로 추가됩니다.
Tim

왜 이렇게 하시겠습니까?
endolith

1
@endolith 일부 라이브러리는 데이터 프레임이 인덱싱 될 것으로 예상합니다. 예를 들어, 일부 시계열 예측 라이브러리는 시간 단계 (일, 월, 연도 등)에 구애받지 않고 시계열을 모델링 할 수 있도록 인덱싱 된 프레임을 입력으로 예상합니다. 따라서 데이터 프레임을 사용하여 변환을 수행하면 인덱싱이 엉망이 될 수 있습니다. 따라서 프레임을 다시 인덱싱하는 것이 일반적입니다.
Cybernetic

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.