วิธีที่ถูกต้องในการย้อนกลับ Panda.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)ไม่ได้ทำงาน แต่ผมไม่ทราบว่าทำไมคุณต้องการที่จะพิมพ์ทั้งOddและคอลัมน์ครั้งเดียวสำหรับแต่ละคอลัมน์ในกรอบซึ่งเป็นสิ่งที่รหัสของคุณจะทำอย่างไรถ้าคุณใช้Even reversed(list(data))
DSM

ฉันต้องการเริ่มเล่นวนซ้ำจากส่วนท้ายของ dataFrame ของฉัน
Michael

2
แล้วผมก็คิดว่าคำถามของคุณเป็นความซ้ำซ้อนของคนนี้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]สำหรับjในrange(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]วิธีการแก้ปัญหา pythonic และถูกต้อง?
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

ไม่มีคำตอบใดที่มีอยู่รีเซ็ตดัชนีหลังจากย้อนกลับ dataframe

สำหรับสิ่งนี้ให้ทำดังต่อไปนี้:

 data[::-1].reset_index()

นี่คือฟังก์ชันยูทิลิตี้ที่จะลบคอลัมน์ดัชนีเก่าตามความคิดเห็นของ @ Tim:

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

เพียงแค่ส่ง dataframe ของคุณไปยังฟังก์ชัน


1
คุณอาจต้องการมีdrop=Trueเช่น: data[::-1].reset_index(drop=True)มิฉะนั้นดัชนีเก่าจะถูกเพิ่มเป็นคอลัมน์บน DataFrame
ทิม

ทำไมคุณถึงต้องการทำเช่นนี้?
endolith

1
@endolith ห้องสมุดบางแห่งคาดว่ากรอบข้อมูลจะถูกจัดทำดัชนี ตัวอย่างเช่นไลบรารีการคาดการณ์อนุกรมเวลาบางแห่งคาดว่าเฟรมที่จัดทำดัชนีเป็นอินพุตเพื่อให้สามารถจำลองอนุกรมเวลาได้ในขณะที่ยังไม่เชื่อเรื่องพระเจ้าไปยังขั้นตอนเวลา (วันเดือนปี ฯลฯ ) ดังนั้นคุณอาจกำลังทำงานกับ data frame ทำการแปลงร่างซึ่งจะทำให้การจัดทำดัชนียุ่งเหยิง เป็นเรื่องปกติที่จะทำดัชนีเฟรมอีกครั้ง
Cybernetic

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.