আমি কীভাবে একটি পান্ডস ডেটা ফ্রেমে 1/0 এ সত্য / মিথ্যা মানচিত্র করতে পারি?


133

আমার পাইথন পান্ডাস ডেটা ফ্রেমে একটি কলাম রয়েছে যার বুলেয়ান ট্রু / ভুয়া মান রয়েছে তবে আরও গণনার জন্য আমার 1/0 উপস্থাপনা দরকার। তাড়াতাড়ি করার জন্য কি কোনও দ্রুত পান্ডা / ছদ্মবেশী উপায় আছে?


1
আর কি গণনা প্রয়োজন?
জন ক্লিমেটস

তোতা @ জোনক্রিমেন্টে, গণনায় ব্যবহারের জন্য আপনাকে বুলকে কী রূপান্তর করতে হবে? বুল গণিতের সাথে সরাসরি কাজ করে (যেহেতু এটি অভ্যন্তরীণভাবে অন্তর্নিহিত)।
cs95

উত্তর:


276

বুলিয়ান মানগুলির একটি একক কলামকে পূর্ণসংখ্যা 1 বা 0 এর কলামে রূপান্তর করার একটি সুসংগত উপায়:

df["somecolumn"] = df["somecolumn"].astype(int)

4
কোণার কেসটি যদি সেখানে এনএএন মান থাকে somecolumn। ব্যবহার করা astype(int)ব্যর্থ হবে। আর একটি পদ্ধতি, যা True1.0 এবং False0.0 এ রূপান্তরিত হয় ( df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
এনওএলটি

@ ডাস্টবাইট ভাল ধরা!
হোমুনকুলাস রেটিকুলি

@ ডাস্টবাইট আপনি কি কেবল astype(float)একই ফলাফল ব্যবহার করতে এবং তা পেতে পারেননি ?
এএমসি

65

আপনার ডেটাফ্রেমকে কেবল 1 (ইনট) দ্বারা গুণ করুন

[1]: data = pd.DataFrame([[True, False, True], [False, False, True]])
[2]: print data
          0      1     2
     0   True  False  True
     1   False False  True

[3]: print data*1
         0  1  2
     0   1  0  1
     1   0  0  1

এই সমাধানের সুবিধা কী কী?
এএমসি

44

Trueহয় 1পাইথন, এবং অনুরূপভাবে Falseহয় 0* :

>>> True == 1
True
>>> False == 0
True

আপনি শুধু তাদের চিকিত্সা যেন তারা সংখ্যায় ছিল, তারা যে কোনো অপারেশন আপনি তাদের চান সঞ্চালন করতে সক্ষম হওয়া উচিত হয় সংখ্যা:

>>> issubclass(bool, int)
True
>>> True * 5
5

সুতরাং আপনার প্রশ্নের উত্তর দেওয়ার জন্য, কোনও কাজের প্রয়োজন নেই - আপনি যা খুঁজছেন তা ইতিমধ্যে আপনার কাছে রয়েছে।

* দ্রষ্টব্য আমি ব্যবহারের হয় একটি ইংরেজি শব্দ, না পাইথন শব্দ যেমন is- Trueকোন র্যান্ডম হিসাবে একই বস্তুর হবে না 1


1
ভাসমান পয়েন্ট গণিত করার জন্য কেবল ডেটা ধরণের সাথে সাবধানতা অবলম্বন করুন: np.sin(True).dtypeএটি আমার জন্য ভাসমান 16।
জর্জেকা

9
আমি একটি বুলিয়ান কলাম সহ একটি dataframe পেয়েছেন, এবং আমি কল করতে পারেন df.my_column.mean()(আপনি পরোক্ষভাবে) শুধু জরিমানা, কিন্তু যখন আমি চেষ্টা করে দেখুন: df.groupby("some_other_column").agg({"my_column":"mean"})আমি পেতে DataError: No numeric types to aggregate, তাই এটি প্রদর্শিত হবে তারা না সবসময় একই। শুধু এফওয়াইআই।
ডোয়ান্ডারসন

পান্ডাস সংস্করণ 24 (এবং সম্ভবত এর আগে) এ আপনি boolকলামগুলি ঠিকঠাক করতে পারেন ।
বলপয়েন্টবেন

1
দেখে মনে হচ্ছে নুলিও বুলিয়ান প্রকারের সাথে ত্রুটি ছুঁড়ে ফেলেছে: TypeError: numpy boolean subtract, the -` ^অপারেটর, অবহিত করা হয়েছে, বিটওয়াইস_সোর, অপারেটর, বা লজিক্যাল_সক্সর ফাংশনটি ব্যবহার করুন @ @ ব্যবহারকারীর উত্তর ব্যবহারটি এটি ঠিক করে।
আমাদাউ কোনে

আরেকটি কারণ এটি এক নয়: df.col1 + + df.col2 + + df.col3 জন্য নয় কাজ করে boolযেমন জন্য করে কলাম intকলাম
colorlace

22

আপনি এটি সরাসরি ফ্রেমেও করতে পারেন

In [104]: df = DataFrame(dict(A = True, B = False),index=range(3))

In [105]: df
Out[105]: 
      A      B
0  True  False
1  True  False
2  True  False

In [106]: df.dtypes
Out[106]: 
A    bool
B    bool
dtype: object

In [107]: df.astype(int)
Out[107]: 
   A  B
0  1  0
1  1  0
2  1  0

In [108]: df.astype(int).dtypes
Out[108]: 
A    int64
B    int64
dtype: object

2

আপনি আপনার ডেটা ফ্রেমের জন্য একটি রূপান্তর ব্যবহার করতে পারেন:

df = pd.DataFrame(my_data condition)

1/04 এ সত্য / মিথ্যা রূপান্তর করা

df = df*1

এটি এই সমাধানটির অনুরূপ , 3 বছর আগে পোস্ট করা হয়েছিল।
এএমসি

1

Series.viewবুলিয়ানকে পূর্ণসংখ্যায় রূপান্তর করতে ব্যবহার করুন :

df["somecolumn"] = df["somecolumn"].view('i1')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.