पांडा डेटाफ्रेम कॉलम dtypes असाइन करें


110

मैं dtypeकई कॉलमों के सेट करना चाहता हूं pd.Dataframe(मेरे पास एक फ़ाइल है जिसे मुझे मैन्युअल रूप से सूचियों की सूची में पार्स करना है, क्योंकि फ़ाइल के लिए उत्तरदायी नहीं था pd.read_csv)

import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
                   dtype={'x':'object','y':'int'},
                   columns=['x','y'])

मुझे मिला

ValueError: entry not a 2- or 3- tuple

एक ही रास्ता है कि मैं उन्हें सेट कर सकते हैं प्रत्येक स्तंभ चर के माध्यम से पाशन और साथ recasting astype

dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
                      columns=['x','y'])
for c in mydata.columns:
    mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype   #=> int64

क्या कोई बेहतर तरीका है?


यह शायद एक अच्छा बग / सुविधा का अनुरोध होगा , वर्तमान में मुझे यकीन नहीं है कि dtype arg क्या कर रहा है (आप इसे एक स्केलर पास कर सकते हैं, लेकिन यह सख्त नहीं है ...)
एंडी हेडन

2
FYI करें: df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])"काम करता है" ... लेकिन: s
एंडी हेडन

1
हाँ, वास्तव में "काम करता है"; अप्रत्याशित रूप से ...
हैमेट्रिक्स

GitHub का यह मुद्दा जल्द ही प्रासंगिक हो सकता है: github.com/pydata/pandas/issues/9287
Amelio Vazquez-Reina

जवाबों:


65

0.17 के बाद से, आपको स्पष्ट रूपांतरण का उपयोग करना होगा:

pd.to_datetime, pd.to_timedelta and pd.to_numeric

(जैसा कि नीचे उल्लेख किया गया है, कोई और "जादू" नहीं, convert_objects0.17 में चित्रित किया गया है)

df = pd.DataFrame({'x': {0: 'a', 1: 'b'}, 'y': {0: '1', 1: '2'}, 'z': {0: '2018-05-01', 1: '2018-05-02'}})

df.dtypes

x    object
y    object
z    object
dtype: object

df

   x  y           z
0  a  1  2018-05-01
1  b  2  2018-05-02

आप इन्हें उस प्रत्येक कॉलम पर लागू कर सकते हैं जिसे आप कनवर्ट करना चाहते हैं:

df["y"] = pd.to_numeric(df["y"])
df["z"] = pd.to_datetime(df["z"])    
df

   x  y          z
0  a  1 2018-05-01
1  b  2 2018-05-02

df.dtypes

x            object
y             int64
z    datetime64[ns]
dtype: object

और पुष्टि करें कि dtype अपडेट किया गया है।


पंडों के लिए OLD / DEPRECated ANSWER 0.12 - 0.16: आप convert_objectsबेहतर dtypyp का पता लगाने के लिए उपयोग कर सकते हैं :

In [21]: df
Out[21]: 
   x  y
0  a  1
1  b  2

In [22]: df.dtypes
Out[22]: 
x    object
y    object
dtype: object

In [23]: df.convert_objects(convert_numeric=True)
Out[23]: 
   x  y
0  a  1
1  b  2

In [24]: df.convert_objects(convert_numeric=True).dtypes
Out[24]: 
x    object
y     int64
dtype: object

जादू! (इसे देखने के लिए उदास।)


2
जैसे type.convertR थोड़; अच्छा है, लेकिन कुछ मामलों में स्पष्ट विनिर्देशों के लिए एक इच्छा छोड़ देता है।
हैमेट्रिक्स

1
यदि आपके पास एक स्तंभ है जो एक स्ट्रिंग होना चाहिए, लेकिन कम से कम एक मूल्य होता है जिसे एक इंट में परिवर्तित किया जा सकता है तो सावधान रहें। यह सब लेता है एक मूल्य है और पूरे क्षेत्र को फ्लोट64 में बदल दिया जाता है
माइकल डेविड वॉटसन

18
मैंने देखा convert_objects()कि पदावनत कर दिया गया है ... मुझे यकीन नहीं है कि इसे बदल दिया गया है?
जोफ्रोमक्ट

6
ऑब्जेक्ट कॉलम के लिए डेटा dtypes को फिर से अनुमान लगाने के लिए, DataFrame.infer_objects ()
जेम्स टोबिन

1
@smci ठीक है, मैंने संपादित किया है। पदावनत उत्तरों का एक गुच्छा है, मुझे उन सभी को खोजने के लिए एक तरीके से काम करने की आवश्यकता है।
एंडी हेडन

62

Google (आदि) से आने वालों के लिए जैसे:

convert_objects 0.17 से हटा दिया गया है - यदि आप इसका उपयोग करते हैं, तो आपको इस तरह की चेतावनी मिलती है:

FutureWarning: convert_objects is deprecated.  Use the data-type specific converters 
pd.to_datetime, pd.to_timedelta and pd.to_numeric.

आपको निम्नलिखित कुछ करना चाहिए:


यदि आप इसके कुछ उदाहरणों में फेंकते pd.to_datetime, to_timedelta, to_numericहैं तो स्वीकृत उत्तर होना चाहिए।
एसएमसीआई

41

आप पंडों के साथ प्रकार स्पष्ट रूप से सेट कर सकते हैं DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)और एक डिक्शनरी में पास कर सकते हैं जिसे आप चाहते हैंdtype

यहाँ एक उदाहरण है:

import pandas as pd
wheel_number = 5
car_name = 'jeep'
minutes_spent = 4.5

# set the columns
data_columns = ['wheel_number', 'car_name', 'minutes_spent']

# create an empty dataframe
data_df = pd.DataFrame(columns = data_columns)
df_temp = pd.DataFrame([[wheel_number, car_name, minutes_spent]],columns = data_columns)
data_df = data_df.append(df_temp, ignore_index=True) 

In [11]: data_df.dtypes
Out[11]:
wheel_number     float64
car_name          object
minutes_spent    float64
dtype: object

data_df = data_df.astype(dtype= {"wheel_number":"int64",
        "car_name":"object","minutes_spent":"float64"})

अब आप देख सकते हैं कि यह बदल गया है

In [18]: data_df.dtypes
Out[18]:
wheel_number       int64
car_name          object
minutes_spent    float64

13

स्तंभ प्रकार सेट करने का एक और तरीका यह है कि पहले अपने इच्छित प्रकारों के साथ एक खस्ता रिकॉर्ड सरणी का निर्माण करें, इसे भरें और फिर इसे एक DataFrame कंस्ट्रक्टर के पास भेज दें।

import pandas as pd
import numpy as np    

x = np.empty((10,), dtype=[('x', np.uint8), ('y', np.float64)])
df = pd.DataFrame(x)

df.dtypes ->

x      uint8
y    float64

0

आपके सामने भी ऐसी ही समस्या है। मेरे मामले में मेरे पास सिस्को लॉग्स से 1000 फाइलें हैं जिन्हें मुझे मैन्युअल रूप से पार्स करने की आवश्यकता है।

खेतों और प्रकारों के साथ लचीला होने के लिए मैंने Stringio + read_cvs का उपयोग करके सफलतापूर्वक परीक्षण किया है जो वास्तव में dtype विनिर्देश के लिए एक तानाशाह को स्वीकार करता है।

मैं आमतौर पर फ़ाइलों में से प्रत्येक (5k-20k लाइनों) को एक बफर में प्राप्त करता हूं और dtype शब्दकोशों को गतिशील रूप से बनाता हूं।

आखिरकार मैं इन डेटाफ़्रेम को एक बड़े डेटा फ्रेम में संग्रहीत करता हूं, जिसे मैं (0.19 के लिए धन्यवाद) के साथ समेटता हूं, जिसे मैं एचडीएमआई 5 में डंप करता हूं।

इन पंक्तियों के साथ कुछ

import pandas as pd
import io 

output = io.StringIO()
output.write('A,1,20,31\n')
output.write('B,2,21,32\n')
output.write('C,3,22,33\n')
output.write('D,4,23,34\n')

output.seek(0)


df=pd.read_csv(output, header=None,
        names=["A","B","C","D"],
        dtype={"A":"category","B":"float32","C":"int32","D":"float64"},
        sep=","
       )

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
A    5 non-null category
B    5 non-null float32
C    5 non-null int32
D    5 non-null float64
dtypes: category(1), float32(1), float64(1), int32(1)
memory usage: 205.0 bytes
None

बहुत अजगर नहीं .... लेकिन काम करता है

आशा करता हूँ की ये काम करेगा।

जे.सी.


0

आप टाइप किए गए np.arrays का उपयोग करके बेहतर हैं, और फिर डेटा और कॉलम नामों को एक शब्दकोश के रूप में पास करें।

import numpy as np
import pandas as pd
# Feature: np arrays are 1: efficient, 2: can be pre-sized
x = np.array(['a', 'b'], dtype=object)
y = np.array([ 1 ,  2 ], dtype=np.int32)
df = pd.DataFrame({
   'x' : x,    # Feature: column name is near data array
   'y' : y,
   }
 )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.