df
पर विचार करें:
In [2098]: df = pd.DataFrame({'a': [1,2], 'b':[3,4]})
In [2099]: df
Out[2099]:
a b
0 1 3
1 2 4
अब, मैं list
मानों को df
में जोड़ने का प्रयास करता हूं:
In [2102]: df.loc[2] = [3, 4]
In [2103]: df
Out[2103]:
a b
0 1 3
1 2 4
2 3 4
अब तक सब अच्छा है।
लेकिन अब जब मैं बूलियन मानों की सूची के साथ एक पंक्ति जोड़ने का प्रयास करता हूं, तो यह इसे int
में बदल देता है:
In [2104]: df.loc[3] = [True, False]
In [2105]: df
Out[2105]:
a b
0 1 3
1 2 4
2 3 4
3 1 0
मुझे पता है कि मैं अपने df
को str
में बदल सकता हूं और फिर बूलियन मान जोड़ सकता हूं, जैसे:
In [2131]: df = df.astype(str)
In [2133]: df.loc[3] = [True, False]
In [2134]: df
Out[2134]:
a b
0 1 3
1 2 4
3 True False
लेकिन, मैं इस व्यवहार के पीछे का कारण जानना चाहता हूं। जब मैं इसमें boolean
जोड़ता हूं तो यह कॉलम के dtypes
को object
में स्वचालित रूप से क्यों नहीं बदल रहा है?
मेरा पांडा संस्करण है:
In [2150]: pd.__version__
Out[2150]: '1.1.0'
2 जवाब
जब मैं इसमें बूलियन जोड़ता हूं तो यह स्वचालित रूप से कॉलम के प्रकार को ऑब्जेक्ट में क्यों नहीं बदल रहा है?
क्योंकि प्रकार अपकास्ट किए जा रहे हैं (देखें अपकास्टिंग), दस्तावेज़ीकरण से:
अन्य प्रकारों के साथ संयुक्त होने पर प्रकारों को संभावित रूप से ऊपर उठाया जा सकता है, जिसका अर्थ है कि उन्हें वर्तमान प्रकार (जैसे int से फ्लोट) से प्रचारित किया जाता है।
अपकास्टिंग सुन्न नियमों के अनुसार कार्य करता है:
अपकास्टिंग हमेशा सुन्न नियमों के अनुसार होता है। यदि ऑपरेशन में दो अलग-अलग प्रकार शामिल हैं, तो ऑपरेशन के परिणाम के रूप में अधिक सामान्य का उपयोग किया जाएगा।
यह समझने के लिए कि सुन्न नियम कैसे लागू होते हैं, आप फ़ंक्शन का उपयोग कर सकते हैं find_common_type, जैसा कि नीचे दिया गया है:
res = np.find_common_type([bool, np.bool], [np.int32, np.int64])
print(res)
आउटपुट
int64
जब आप df.loc[0]
करते हैं तो यह एक pd.Series
में बदल जाता है, जैसा कि नीचे दिखाया गया है:
>>> type(df.loc[0])
<class 'pandas.core.series.Series'>
और अब, सीरीज में केवल एक dtype
होगा। इस प्रकार यह bool
ईन्स को पूर्णांकों के लिए बाध्य करता है।
तो ठीक करने का तरीका df.loc[[0]]
का उपयोग करना है यदि आप पंक्तियों को प्राप्त करने का प्रयास कर रहे हैं:
>>> type(df.loc[[0]])
<class 'pandas.core.frame.DataFrame'>
लेकिन इस मामले में, आपको 2 नई खाली पंक्तियाँ बनाने की आवश्यकता है, फिर df.loc[[...]]
के साथ मान जोड़ें क्योंकि df.loc[[...]]
केवल अनुक्रमण के लिए है, आप उसके साथ नई पंक्तियाँ निर्दिष्ट नहीं कर सकते।
तो यहां बताया गया है कि आप df.loc[[...]]
के साथ पंक्तियां कैसे प्राप्त कर सकते हैं:
>>> df = pd.DataFrame({'a': [1,2], 'b':[3,4]})
>>> df.loc[0]
a 1
b 3
Name: 0, dtype: int64
>>> df.loc[[0]]
a b
0 1 3
>>>
यहां आप अंतर देखते हैं, पहला कोड केवल एक dtype
के साथ एक Series
में बदल जाता है जबकि दूसरा कोड एक DataFrame
देता है।
लेकिन इस मामले के लिए आप df.loc[[...]]
का उपयोग नहीं कर सकते, क्योंकि आप इसके साथ चीजें असाइन नहीं कर सकते हैं, इसलिए आप केवल df.loc[[...]]
का उपयोग करके नई खाली पंक्तियाँ बनाने के साथ जा सकते हैं:
>>> df = pd.DataFrame({'a': [1,2], 'b':[3,4]})
>>> df
a b
0 1 3
1 2 4
>>> df.loc[2] = [3, 4]
>>> df
a b
0 1 3
1 2 4
2 3 4
>>> df.loc[3] = 0
>>> df
a b
0 1 3
1 2 4
2 3 4
3 0 0
>>> df.loc[[3]] = [True, False]
>>> df
a b
0 1 3
1 2 4
2 3 4
3 True False
>>>
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।