我想将一些数据带入pandas DataFrame,我想在导入时为每列分配dtypes。我希望能够为具有许多不同列的较大数据集执行此操作,但是,作为示例:
myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes
结果:
TypeError:数据类型不理解
我尝试了一些其他方法,例如:
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})
TypeError:类型为'type'的对象没有len()
如果我放dtype=(float,int)
,它会将浮动格式应用于两列。
最后,我希望能够传递一个数据类型列表,就像我可以传递一个列名列表一样。
答案 0 :(得分:13)
我刚刚碰到这个,大熊猫问题仍然存在,所以我发布了我的解决方法。假设df
是我的DataFrame而dtype
是一个dict映射列名称到类型:
for k, v in dtype.items():
df[k] = df[k].astype(v)
(注意:在python 2中使用dtype.iteritems()
)
供参考:
dtypes
):https://docs.scipy.org/doc/numpy-1.12.0/reference/arrays.dtypes.html category
:http://pandas.pydata.org/pandas-docs/stable/categorical.html 答案 1 :(得分:3)
您可能想尝试将Series
个对象的字典传递给DataFrame
构造函数 - 它会为您提供更具体的控制权,并希望能够更清楚地了解正在发生的事情。模板版本(data1
可以是数组等。):
df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
'column2':pd.Series(data2, dtype='type2')})
数据示例:
df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
'B':pd.Series([7,8,9], dtype='float')})
print (df)
A B
0 1 7.0
1 2 8.0
2 3 9.0
print (df.dtypes)
A int32
B float64
dtype: object
答案 2 :(得分:1)
从pandas 0.24.2版(当前的稳定版本)开始,无法将文档类型的显式数据类型列表传递给DataFrame构造函数:
dtype : dtype, default None
Data type to force. Only a single dtype is allowed. If None, infer
但是,dataframe类确实具有静态方法,使您可以将numpy结构化数组转换为数据框,从而可以执行以下操作:
>>> myarray = np.random.randint(0,5,size=(2,2))
>>> record = np.array(map(tuple,myarray),dtype=[('a',np.float),('b',np.int)])
>>> mydf = pd.DataFrame.from_records(record)
>>> mydf.dtypes
a float64
b int64
dtype: object
答案 3 :(得分:0)
在处理数据类型时,应将它们作为字符串传递。
例如,您遵循的后一种方法应修改为
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **'int'**})
代替
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **int**})
。
dtype (int, float etc.)
应该以字符串形式给出。
或者作为替代方法(如果您不想作为字符串传递)
将numpy导入为np 并使用
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **np.int**})