পান্ডাস বিপরীত করার সঠিক উপায়.ডাটা ফ্রেম?


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"কিনা, যা কোনও কলামও নয়। আপনি কি কেবল কলামের ক্রমটি বিপরীত করতে দেখছেন?
ডিএসএম

আপনি কি বলতে চেয়েছিলেন data[["Odd", "Even"]]বা আরও সাধারণভাবে data[data.columns[::-1]]?
ফ্রেড ফু

1
আপনি যে আউটপুটটি চান তার উদাহরণ এখনও দেয় নি। আমি জানি যে কীভাবে বাস্তবটি পাওয়া যায় তা কার্যকর reversed(data)হয় না তবে আমি কেন জানি না আপনি ফ্রেমে প্রতিটি কলামের জন্য একবারে পুরো Oddএবং Evenকলামগুলি মুদ্রণ করতে চান , যা আপনি যদি ব্যবহার করেন তবে আপনার কোডটি কী করবে reversed(list(data))
ডিএসএম

আমি আমার ডেটা ফ্রেমের শেষ থেকে লুপটি শুরু করতে চাই
মাইকেল

2
তারপর আমি মনে করি আপনার প্রশ্নের একটি DUP হয় এই এক , এবং আপনার মত কিছু করতে চান for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]। আপনার প্রত্যাশিত আউটপুট সম্পর্কে দয়া করে আপনার প্রশ্নে সর্বদা উদাহরণ দিন; এটি প্রত্যেকের জীবনকে অনেক সহজ করে তোলে।
ডিএসএম

উত্তর:


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]জন্য 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)
অনুমানের

3
করতে পারি data = data.reindex(index=data.index[::-1])তারপর data.reset_index(inplace=True, drop=True)এবং এটি জায়গায় রিসেট হবে।
ম্যাচগুলি

4
কি df = df[::-1]একটি pythonic এবং বৈধ সমাধান?
tommy.carstensen

@ tommy.carstensen হ্যাঁ, এবং এটি শীর্ষ উত্তর হওয়া উচিত
রোস্ট্রিপি

65

আপনি আরও সহজ উপায়ে সারিগুলি বিপরীত করতে পারেন:

df[::-1]

3
আমি এর reverse()সাথে আমার নিজস্ব পদ্ধতিটি সংজ্ঞায়িত করতে পছন্দ করি pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]কারণ শৃঙ্খলাবদ্ধ পদ্ধতিগুলি যেমন, দেখতে এটি দুর্দান্ত লাগে df.reverse().iterrows()
বেন ম্যারেস

4

বিদ্যমান উত্তরগুলির মধ্যে কোনওই ডেটাফ্রেমের বিপরীতে সূচি পুনরায় সেট করে না।

এর জন্য, নিম্নলিখিতগুলি করুন:

 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):, অন্যথায় পুরানো সূচকটি ডেটা ফ্রেমের কলাম হিসাবে যুক্ত করা হবে।
টিম

তুমি কেন এটা করতে চাও?
এন্ডোলিথ

@ এন্ডোলিথ কিছু লাইব্রেরি ডেটা ফ্রেমটিকে সূচিবদ্ধ করার আশা করে। উদাহরণস্বরূপ, কিছু সময়ের সিরিজ পূর্বাভাস গ্রন্থাগারগুলি ইনডেক্স হিসাবে একটি সূচিযুক্ত ফ্রেম প্রত্যাশা করে যাতে এটি সময় ধাপে (অধ্যয়নকাল, দিন, মাস, ইত্যাদি) অবধি থাকা অবস্থায় একটি সময় সিরিজকে মডেল করতে পারে। সুতরাং আপনি একটি ডেটা ফ্রেমের সাথে কাজ করতে পারেন, এটির উপর একটি রূপান্তর করুন, যা সূচকে বিশৃঙ্খলা করে। এইভাবে ফ্রেমটিকে পুনর্নির্মাণ করা সাধারণ।
সাইবারনেটিক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.