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'
6
Mayank Porwal 23 पद 2020, 11:02

2 जवाब

सबसे बढ़िया उत्तर

जब मैं इसमें बूलियन जोड़ता हूं तो यह स्वचालित रूप से कॉलम के प्रकार को ऑब्जेक्ट में क्यों नहीं बदल रहा है?

क्योंकि प्रकार अपकास्ट किए जा रहे हैं (देखें अपकास्टिंग), दस्तावेज़ीकरण से:

अन्य प्रकारों के साथ संयुक्त होने पर प्रकारों को संभावित रूप से ऊपर उठाया जा सकता है, जिसका अर्थ है कि उन्हें वर्तमान प्रकार (जैसे int से फ्लोट) से प्रचारित किया जाता है।

अपकास्टिंग सुन्न नियमों के अनुसार कार्य करता है:

अपकास्टिंग हमेशा सुन्न नियमों के अनुसार होता है। यदि ऑपरेशन में दो अलग-अलग प्रकार शामिल हैं, तो ऑपरेशन के परिणाम के रूप में अधिक सामान्य का उपयोग किया जाएगा।

यह समझने के लिए कि सुन्न नियम कैसे लागू होते हैं, आप फ़ंक्शन का उपयोग कर सकते हैं find_common_type, जैसा कि नीचे दिया गया है:

res = np.find_common_type([bool, np.bool], [np.int32, np.int64])
print(res)

आउटपुट

int64
3
Dani Mesejo 23 पद 2020, 11:46

जब आप 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
>>> 
0
U11-Forward 23 पद 2020, 11:28