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だと思う、この1、そしてあなたのような何かをしたいですfor i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]。常に、期待する出力に関する質問の例を挙げてください。それは誰にとってもはるかに簡単な生活になります。
DSM

回答:


246
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 2017

3
data = data.reindex(index=data.index[::-1])その後data.reset_index(inplace=True, drop=True)、それを行うことができ、所定の位置にリセットされます。
Matts、2018

4
あるdf = df[::-1]ニシキヘビ、有効な解決策は?
tommy.carstensen 2018年

@ tommy.carstensenはい、それが一番の答えになるはずです
rosstripi

65

さらに簡単な方法で行を逆にすることができます。

df[::-1]

3
独自のreverse()メソッドをで定義したいのは、メソッドをpd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]チェーンするときに見栄えがするためdf.reverse().iterrows()です。
Ben Mares

4

既存の回答のいずれも、データフレームを反転した後にインデックスをリセットしません。

これを行うには、以下を実行します。

 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の列として追加されます。
ティム

なぜこれをしたいのですか?
内部石

@endolith一部のライブラリは、データフレームがインデックス付けされることを期待しています。たとえば、一部の時系列予測ライブラリは、インデックス付きフレームを入力として期待するため、タイムステップ(日、月、年など)にとらわれずに時系列をモデル化できます。したがって、データフレームを操作している場合、データフレームを変換すると、インデックスがめちゃくちゃになります。したがって、フレームのインデックスを再作成するのが一般的です。
サイバネティック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.