पंडों के डेटाफ़्रेम में मैं सच्चे / झूठे 1/0 का नक्शा कैसे बना सकता हूं?


133

मेरे पास पाइथन पांडा डेटाफ़्रेम में एक स्तंभ है जिसमें बूलियन ट्रू / गलत मान हैं, लेकिन आगे की गणना के लिए मुझे 1/0 प्रतिनिधित्व की आवश्यकता है। वहाँ एक त्वरित पांडा / ऐसा करने के लिए संख्यात्मक तरीका है?


1
आगे क्या गणना की आवश्यकता है?
जॉन क्लेमेंट्स

@JonClements के लिए तोता, आपको गणना में उपयोग करने के लिए बूल में बदलने की आवश्यकता क्यों है? बूल सीधे अंकगणित के साथ काम करता है (क्योंकि यह आंतरिक रूप से एक इंट है)।
cs95

जवाबों:


276

पूर्णांक 1 या 0 के कॉलम में बूलियन मानों के एकल स्तंभ को परिवर्तित करने का एक सफल तरीका

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

4
कोने का मामला है अगर वहाँ NaN मान हैं somecolumn। उपयोग astype(int)करना तब विफल हो जाएगा। एक अन्य दृष्टिकोण, जो TrueFalsedf.somecolumn = df.somecolumn.replace({True: 1, False: 0})
NaN-

@DustByte अच्छा पकड़!
होम्युनकुलस रेटिकुल्ली

@DustByte क्या आप केवल उपयोग नहीं कर सकते astype(float)और एक ही परिणाम प्राप्त कर सकते हैं?
एएमसी

65

बस अपने डेटाफ़्रेम को 1 से गुणा करें (int)

[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
मुझे बूलियन कॉलम के साथ एक डेटाफ्रेम मिला है, और मैं df.my_column.mean()बस ठीक कह सकता हूं (जैसा कि आप समझते हैं ), लेकिन जब मैं कोशिश करता df.groupby("some_other_column").agg({"my_column":"mean"})हूं : मुझे मिलता है DataError: No numeric types to aggregate, इसलिए ऐसा प्रतीत होता है कि वे हमेशा समान नहीं होते हैं । सिर्फ आपकी जानकारी के लिए।
dwanderson

पांडा संस्करण 24 (और शायद पहले) में आप boolस्तंभों को बस ठीक कर सकते हैं।
बॉलपॉइंटबैन

1
ऐसा लगता है कि सुन्न भी बूलियन प्रकारों के साथ त्रुटियों को फेंकता है: TypeError: numpy boolean subtract, the -` ऑपरेटर, को पदावनत ^कर दिया जाता है, इसके बजाय बिटवाइज़_एक्सॉर, ऑपरेटर, या लॉजिकल_एक्सकोर फ़ंक्शन का उपयोग करें। ` @ उपयोगकर्ता के उत्तर का उपयोग करके इसे ठीक करता है।
अमादौ कोन

एक और कारण यह एक समान नहीं है: df.col1 + df.col2 + df.col3 boolस्तंभों के लिए काम नहीं करता है क्योंकि यह intस्तंभों के लिए करता है
19 '21:

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


1

Series.viewबूलियन को पूर्णांक में बदलने के लिए उपयोग करें :

df["somecolumn"] = df["somecolumn"].view('i1')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.