পান্ডাস ডেটাফ্রেম কলামের টাইপগুলি নির্ধারণ করুন


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

আমি তাদের সেট করার একমাত্র উপায় হ'ল প্রতিটি কলামের ভেরিয়েবলের মধ্য দিয়ে লুপিং করে এবং পুনরায় সংযুক্ত করে 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

একটি ভাল উপায় আছে কি?


এটি সম্ভবত একটি ভাল বাগ / বৈশিষ্ট্য অনুরোধ হবে , বর্তমানে আমি টাইপ আরগ কী করছে তা নিশ্চিত নই (আপনি এটি একটি স্কেলারটি পাস করতে পারেন তবে এটি কঠোর নয়) ...
অ্যান্ডি হেডেন

2
এফওয়াইআই: df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])"কাজ করে" ... তবে: গুলি
অ্যান্ডি হেডেন

1
হ্যাঁ, "কাজ করে" সত্যই; অপ্রত্যাশিতভাবে ...
হ্যাটম্যাট্রিক্স

এই গিটহাব ইস্যুটি শীঘ্রই প্রাসঙ্গিক হয়ে উঠতে পারে: github.com/pydata/pandas/issues/9287
আমেলিও

উত্তর:


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 আপডেট হয়েছে তা নিশ্চিত করুন।


convert_objectsপান্ডার 0.12 - 0.16 এর জন্য ওল্ড / অবহেলিত উত্তর

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.convertকিছুটা আর এর মতো ; ভাল তবে কিছু ক্ষেত্রে সুস্পষ্ট স্পেসিফিকেশনের জন্য আগ্রহী রেখে দেয়।
হ্যাটম্যাট্রিক্স

1
আপনার যদি কলাম থাকে যা স্ট্রিং হওয়া দরকার তবে কমপক্ষে একটি মান থাকতে পারে যা কোনও ইন্টারে রূপান্তর করতে পারে careful এটির যা কিছু লাগে তা একটি মান এবং পুরো ক্ষেত্রটি ফ্লোট 64 এ রূপান্তরিত হয়
মাইকেল ডেভিড ওয়াটসন

18
আমি লক্ষ্য করেছি convert_objects()অবমাননাকর হয়েছে ... আমি নিশ্চিত নই এটি কী বদলেছে?
joefromct

6
অবজেক্ট কলামগুলির জন্য ডেটা টাইপগুলি পুনরায় নির্ধারণ করতে, DataFrame.infer_objects () ব্যবহার করুন
জেমস টোবিন

1
@ এসএমসি ঠিক আছে, আমি সম্পাদনা করেছি। অবতীর্ণ উত্তরগুলির একটি গুচ্ছ রয়েছে, সেগুলি খুঁজে বের করার জন্য আমার একটি উপায় বের করা উচিত।
অ্যান্ডি হেডেন

62

গুগল (ইত্যাদি) থেকে আগতদের জন্য যেমন আমার মতো:

convert_objects ০.০7 থেকে অবহেলিত হয়েছে - আপনি যদি এটি ব্যবহার করেন তবে আপনি এই জাতীয় সতর্কতা পান:

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

কলামের ধরণগুলি সেট করার আর একটি উপায় হ'ল প্রথমে আপনার পছন্দসই ধরণের সাথে একটি নমপি রেকর্ড অ্যারে তৈরি করা, এটি পূরণ করুন এবং তারপরে এটি একটি ডেটা ফ্রেম কনস্ট্রাক্টরের কাছে প্রেরণ করুন।

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 টি ফাইল রয়েছে যা আমাকে নিজেই বিশ্লেষণ করতে হবে।

ক্ষেত্র এবং প্রকারের সাথে নমনীয় হওয়ার জন্য আমি স্ট্রিংআইও + রিড_সিভিগুলি ব্যবহার করে সফলভাবে পরীক্ষা করেছি যা প্রকৃতপক্ষে dtype স্পেসিফিকেশনের জন্য ডিক গ্রহণ করে।

আমি সাধারণত প্রতিটি ফাইল (5k-20k লাইন) একটি বাফারে নিয়ে যাই এবং ডাইটিপ অভিধানগুলি গতিশীলভাবে তৈরি করি।

অবশেষে আমি কনটেনেটেট (স্পষ্টিকাল ... 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

টাইপ করা এনপি.আররেইস ব্যবহার করে আপনি আরও ভাল হন এবং তারপরে অভিধান হিসাবে ডেটা এবং কলামের নামগুলি পাস করুন pass

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,
   }
 )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.