Python 如何在构建数据帧时强制其使用所需的数据类型?

Python 如何在构建数据帧时强制其使用所需的数据类型?,python,pandas,Python,Pandas,例如: raw = {'x':[1,2,3,4], 'y':[None,]*4, 'z':[datetime.now()] *4, 'e':[1,2,3,4]} a = pd.DataFrame(raw, dtype={'x':float, 'y':float, 'z':object, 'e':int}) 这不管用 目前我必须做: a = pd.DataFrame(raw, dtype=object) a['x'] = a['x'].astype(float) a['y'] = a['y']

例如:

raw = {'x':[1,2,3,4], 'y':[None,]*4, 'z':[datetime.now()] *4, 'e':[1,2,3,4]}

a = pd.DataFrame(raw, dtype={'x':float, 'y':float, 'z':object, 'e':int})
这不管用

目前我必须做:

a = pd.DataFrame(raw, dtype=object)
a['x'] = a['x'].astype(float)
a['y'] = a['y'].astype(float)
a['z'] = pd.to_date_time(a['z'], utc=True)
a['e'] = a['e'].astype(int)
由于我有许多
raw
对象要转换到数据帧中,有没有一种简单的方法可以在构建时强制使用正确的
dtype
,而不是在以后转换它们,这需要2倍的时间

@Jeff有一个很好的方法来处理dict格式的
raw

但是如果
raw
是记录格式,比如:

raw = [(1,None,datetime.now(),1),
       (2,None,datetime.now(),2), 
       (3,None,datetime.now(),3),
       (4,None,datetime.now(),4)]
我必须
zip
it吗?也许制作
zip
所花费的时间会比之后再次播放花费更多?
DataFrame.from_records
似乎根本不接受
dtype
参数。

构造函数将正确推断非歧义类型。您不能指定复合数据类型映射ATM,问题是,欢迎拉请求来实现这一点

  • 不要使用
    None
    ,而是使用
    np.nan
    (否则它将推断为
    对象
    dtype)
  • 指定带小数点的浮点(或换行为系列,例如
    系列([1,2,3,4],dtype='float')
  • datetimes将自动推断为
    datetime64[ns]
    ,这几乎总是您想要的,除非您需要指定时区
这是你的例子

In [20]: DataFrame({
    'x':Series([1,2,3,4],dtype='float'), 
    'y':Series([None,]*4,dtype='float'), 
    'z':[datetime.datetime.now()] *4, 
    'e':[1,2,3,4]})
Out[20]: 
   e  x   y                          z
0  1  1 NaN 2014-06-17 07:40:42.188422
1  2  2 NaN 2014-06-17 07:40:42.188422
2  3  3 NaN 2014-06-17 07:40:42.188422
3  4  4 NaN 2014-06-17 07:40:42.188422

In [21]: DataFrame({
     'x':Series([1,2,3,4],dtype='float'), 
     'y':Series([None,]*4,dtype='float'), 
     'z':[datetime.datetime.now()] *4, 
     'e':[1,2,3,4]}).dtypes
Out[21]: 
e             int64
x           float64
y           float64
z    datetime64[ns]
dtype: object

抱歉,可能我没有说清楚。我无法控制
raw
中的类型。它是按原样提供的。