Voici mon code:
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'])
Quand je lance ce code, j'obtiens l'erreur suivante:
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'
Pourquoi est-ce que je reçois cette erreur?
Comment puis-je résoudre ce problème?
Quelle est la bonne façon d’inverser pandas.DataFrame
?
data.reindex(index=data.index[::-1])
ou simplement:
data.iloc[::-1]
va inverser votre trame de données, si vous voulez avoir une boucle for
qui va de bas en haut, vous pouvez faire:
for idx in reversed(data.index):
print(idx, data.loc[idx, 'Even'], data.loc[idx, 'Odd'])
ou
for idx in reversed(data.index):
print(idx, data.Even[idx], data.Odd[idx])
Vous obtenez une erreur car reversed
appelle d'abord data.__len__()
qui retourne 6. Ensuite, il essaie d'appeler data[j - 1]
pour j
dans range(6, 0, -1)
, et le premier appel serait être data[5]
; mais dans pandas dataframe data[5]
signifie la colonne 5, et comme il n'y a pas de colonne 5, une exception est générée. (voir docs )
Vous pouvez inverser les lignes d'une manière encore plus simple:
df[::-1]