2016-10-17 6 views
5

मेरे पास xiv नामक एक पांडा डेटाफ्रेम ऑब्जेक्ट है जिसमें int64 वॉल्यूम माप का कॉलम है।कब आवेदन करें (pd.to_numeric) और जब पाइथन में astype (np.float64) को कब करें?

In[]: xiv['Volume'].head(5) 
Out[]: 

0 252000 
1 484000 
2  62000 
3 168000 
4 232000 
Name: Volume, dtype: int64 

मैंने पढ़ लिया है अन्य पदों (जैसे this और this) कि निम्नलिखित समाधान सुझाव देते हैं। लेकिन जब मैं या तो दृष्टिकोण का उपयोग, यह अंतर्निहित डेटा की dtype बदलने के लिए प्रकट नहीं होता है:

In[]: xiv['Volume'] = pd.to_numeric(xiv['Volume']) 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('int64') 

या ...

In[]: xiv['Volume'] = pd.to_numeric(xiv['Volume']) 
Out[]: ###omitted for brevity### 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('int64') 

In[]: xiv['Volume'] = xiv['Volume'].apply(pd.to_numeric) 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('int64') 

मैं भी एक अलग पांडा बनाने की कोशिश की है Series और उस श्रृंखला पर ऊपर सूचीबद्ध विधियों का उपयोग करके और x['Volume'] पर फिर से सौंपना, जो pandas.core.series.Series ऑब्जेक्ट है।

मेरे पास है, तथापि, numpy पैकेज के float64 प्रकार का उपयोग कर इस समस्या का समाधान मिल गया - इस काम करता है लेकिन क्यों यह अलग है मैं नहीं जानता।

In[]: xiv['Volume'] = xiv['Volume'].astype(np.float64) 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('float64') 

किसी pandas पुस्तकालय numpy पुस्तकालय अपने float64 वर्ग के साथ आसानी से कर रहा है क्या के साथ पूरा करने के लिए कैसे व्याख्या कर सकते हैं; यानी xiv डेटाफ्रेम को float64 पर कॉलम में कनवर्ट करें।

+0

'int64' पहले से ही" संख्यात्मक "प्रकार है। 'to_numeric()' को संख्याओं को संख्यात्मक dtypes में बदलने में मदद करनी चाहिए ... – MaxU

+0

उद्धृत पोस्ट से पता चलता है कि 'to_numeric' को कॉल करके 'dtype' लौटाया गया'' float64' होगा ... – d8aninja

+0

यह जांचें: 'pd.to_numeric (pd। श्रृंखला ([ '1', '2', '3']))। dtype'। यह केवल तभी आवश्यक होगा जब आवश्यक हो: 1. श्रृंखला में NaN या गैर-परिवर्तनीय मान हैं/हैं। 2. श्रृंखला – MaxU

उत्तर

10

आप पहले से ही सांख्यिक dtypes (int8|16|32|64, float64, boolean) आप इसे पांडा.astype() विधि का उपयोग कर एक और "सांख्यिक" dtype में कन्वर्ट कर सकते हैं।

डेमो:

In [90]: df = pd.DataFrame(np.random.randint(10**5,10**7,(5,3)),columns=list('abc'), dtype=np.int64) 

In [91]: df 
Out[91]: 
     a  b  c 
0 9059440 9590567 2076918 
1 5861102 4566089 1947323 
2 6636568 162770 2487991 
3 6794572 5236903 5628779 
4 470121 4044395 4546794 

In [92]: df.dtypes 
Out[92]: 
a int64 
b int64 
c int64 
dtype: object 

In [93]: df['a'] = df['a'].astype(float) 

In [94]: df.dtypes 
Out[94]: 
a float64 
b  int64 
c  int64 
dtype: object 

यह object (स्ट्रिंग) dtypes के लिए काम करेंगे नहीं, कि संख्या में परिवर्तित नहीं किया जा सकता है:

In [95]: df.loc[1, 'b'] = 'XXXXXX' 

In [96]: df 
Out[96]: 
      a  b  c 
0 9059440.0 9590567 2076918 
1 5861102.0 XXXXXX 1947323 
2 6636568.0 162770 2487991 
3 6794572.0 5236903 5628779 
4 470121.0 4044395 4546794 

In [97]: df.dtypes 
Out[97]: 
a float64 
b  object 
c  int64 
dtype: object 

In [98]: df['b'].astype(float) 
... 
skipped 
... 
ValueError: could not convert string to float: 'XXXXXX' 

तो यहां हम pd.to_numeric() उपयोग करना चाहते हैं विधि:

In [99]: df.b = pd.to_numeric(df['b'], errors='coerse') 

In [100]: df 
Out[100]: 
      a   b  c 
0 9059440.0 9590567.0 2076918 
1 5861102.0  NaN 1947323 
2 6636568.0 162770.0 2487991 
3 6794572.0 5236903.0 5628779 
4 470121.0 4044395.0 4546794 

In [101]: df.dtypes 
Out[101]: 
a float64 
b float64 
c  int64 
dtype: object 
संबंधित मुद्दे