如何强制pandas DataFrame在构建时使用期望的数据类型?

3 投票
1 回答
2871 浏览
提问于 2025-04-18 10:04

比如说:

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 对象想要转换成数据框(dataframe),有没有简单的方法可以在构建的时候就强制设置正确的数据类型(dtypes),而不是之后再去转换,这样会花费两倍的时间。

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

但是如果 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 个回答

3

构造函数会正确推断出不模糊的类型。目前你不能指定复合数据类型的映射,相关问题可以在这里找到,欢迎提交请求来实现这个功能。

  • 不要使用 None,应该用 np.nan(否则会推断为 object 类型)
  • 指定浮点数时要加上小数点(或者用 Series 包裹,比如 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

撰写回答