我想在pd.Dataframe
中设置多个列的dtype
(我有一个文件,我必须手动将其解析为列表列表,因为该文件不支持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
有没有更好的方法?
发布于 2017-04-08 09:26:14
您可以使用pandas DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
显式设置类型,并传入包含要dtype
的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
发布于 2016-07-02 12:49:53
设置列类型的另一种方法是首先构造一个具有所需类型的numpy记录数组,填充它,然后将其传递给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
发布于 2018-03-09 06:25:59
最好使用类型化的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,
}
)
https://stackoverflow.com/questions/21197774
复制相似问题