如何强制pandas DataFrame在构造时使用所需的dtypes?

时间:2014-06-17 11:37:10

标签: 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'].astype(float)
a['z'] = pd.to_date_time(a['z'], utc=True)
a['e'] = a['e'].astype(int)

由于我想要将多个raw个对象投射到数据框中,是否有一种简单的方法可以强制正确dtypes构建时间,而不是稍后转换它们,这需要2倍需要时间。

@Jeff有一个很好的方法来处理raw,如果它是dict格式。

但如果raw采用记录格式,例如:

,该怎么办?
raw = [(1,None,datetime.now(),1),
       (2,None,datetime.now(),2), 
       (3,None,datetime.now(),3),
       (4,None,datetime.now(),4)]

我必须zip吗?也许zip花费的时间比花费更多的费用还要多吗? DataFrame.from_records似乎根本不接受dtype参数。

1 个答案:

答案 0 :(得分:3)

构造函数将正确推断非模糊类型。您不能指定复合dtype映射ATM,问题是here,欢迎拉请求实现此。

  • 请勿使用None,而是使用np.nan(否则会推断为object dtype)
  • 指定带小数点的浮点数(或换行为系列,例如Series([1,2,3,4],dtype='float')
  • 日期时间将自动推断为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