पंडों को उलटने का सही तरीका। 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]],?
फ्रेड फू

1
आपने अभी भी अपने इच्छित आउटपुट का उदाहरण नहीं दिया है। मुझे पता है कि इस तथ्य के इर्द-गिर्द कैसे reversed(data)काम किया जाता है, लेकिन मुझे नहीं पता कि आप फ्रेम में प्रत्येक कॉलम के लिए एक बार पूरे Oddऔर Evenकॉलम को क्यों प्रिंट करना चाहते हैं , जो कि आपके कोड का उपयोग करने पर आपका कोड क्या करेगा reversed(list(data))
DSM

मैं अपने डेटा के अंत से लूप के लिए शुरू करना चाहता हूं
माइकल

2
तब मुझे लगता है कि आपका प्रश्न इस बात का एक कारण है , और आप कुछ चाहते हैं for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]। कृपया अपने द्वारा अपेक्षित आउटपुट के प्रश्न में हमेशा उदाहरण दें; यह सभी पर जीवन को आसान बनाता है।
डीएसएम

जवाबों:


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():
kristian

किसी भी तरह से यह करने के लिए जगह में ? काल्पनिक के समतुल्यdata.reindex(index=data.index[::-1], inplace=True)
न्यूरॉन क्यू

3
data = data.reindex(index=data.index[::-1])तब कर सकते हैं data.reset_index(inplace=True, drop=True)और यह जगह में रीसेट हो जाएगा।
मैट्स

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()
बेन मार्स

5

मौजूदा उत्तरों में से कोई भी डेटाफ़्रेम उलटने के बाद सूचकांक को रीसेट नहीं करता है।

इसके लिए, निम्नलिखित कार्य करें:

 data[::-1].reset_index()

यहां एक उपयोगिता फ़ंक्शन है जो @ टिम की टिप्पणी के अनुसार पुराने सूचकांक कॉलम को भी हटाता है:

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

बस फ़ंक्शन में अपना डेटाफ़्रेम पास करें


1
आप शायद चाहते हैं drop=True, अर्थात: data[::-1].reset_index(drop=True)अन्यथा, पुराने सूचकांक को DataFrame पर एक कॉलम के रूप में जोड़ा जाएगा।
टिम

तुमने ऐसा क्यों करना चाहोगे?
23

1
@endolith कुछ लाइब्रेरी डेटा फ्रेम को अनुक्रमित किए जाने की अपेक्षा करते हैं। उदाहरण के लिए, कुछ समय श्रृंखला पूर्वानुमान पुस्तकालयों इनपुट के रूप में एक अनुक्रमित फ्रेम की अपेक्षा करते हैं ताकि यह समय चरण (दिन, महीने, वर्ष, आदि) के लिए शेष अज्ञेय के रूप में एक समय श्रृंखला मॉडल कर सके। तो आप एक डेटा फ्रेम के साथ काम कर रहे होंगे, उस पर एक परिवर्तन कर सकते हैं, जो अनुक्रमण को गड़बड़ कर देता है। इस प्रकार फ्रेम को फिर से जोड़ना आम है।
साइबरनेटिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.