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'])
Lorsque j'exécute 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 ai-je cette erreur?
Comment puis-je résoudre ce problème?
Quelle est la bonne façon de faire marche arrière pandas.DataFrame
?
"One"
n'est pas une colonne dansdata
, et je ne sais pas siTwo
est une variable ou une faute de frappe pour"Two"
, qui n'est pas non plus une colonne. Cherchez-vous simplement à inverser l'ordre des colonnes?data[["Odd", "Even"]]
, ou plus généralementdata[data.columns[::-1]]
,?reversed(data)
ne fonctionne pas, mais je ne sais pas pourquoi vous voudriez imprimer le toutOdd
et lesEven
colonnes une fois pour chaque colonne du cadre, ce que votre code ferait si vous l'utilisiezreversed(list(data))
.for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]
. Veuillez toujours donner des exemples dans votre question de la sortie que vous attendez; cela rend la vie beaucoup plus facile pour tout le monde.Réponses:
ou simplement:
va inverser votre trame de données, si vous voulez avoir une
for
boucle qui va de bas en haut, vous pouvez faire:ou
Vous obtenez une erreur parce que le
reversed
premier appelledata.__len__()
qui renvoie 6. Ensuite, il essaie d'appelerdata[j - 1]
pourj
inrange(6, 0, -1)
, et le premier appel seraitdata[5]
; mais dans pandas dataframedata[5]
signifie la colonne 5, et il n'y a pas de colonne 5 donc il lancera une exception. (voir docs )la source
for index, row in df.iloc[::-1].iterrows():
data.reindex(index=data.index[::-1], inplace=True)
data = data.reindex(index=data.index[::-1])
alorsdata.reset_index(inplace=True, drop=True)
et il sera remis en place.df = df[::-1]
solution pythonique et valable?Vous pouvez inverser les lignes de manière encore plus simple:
la source
reverse()
méthode avecpd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]
parce qu'elle est plus jolie lors du chaînage de méthodes, par exempledf.reverse().iterrows()
.Aucune des réponses existantes ne réinitialise l'index après l'inversion de la trame de données.
Pour cela, procédez comme suit:
Voici une fonction utilitaire qui supprime également l'ancienne colonne d'index, selon le commentaire de @ Tim:
Passez simplement votre dataframe dans la fonction
la source
drop=True
, c'est-à-diredata[::-1].reset_index(drop=True)
:, sinon l'ancien index sera ajouté en tant que colonne sur le DataFrame.Cela marche:
la source