【问题标题】:pandas dataframe early data typing熊猫数据框早期数据类型
【发布时间】:2020-02-27 23:21:56
【问题描述】:

我正在尝试从数据库加载相对大量的数据,并且我想通过在开始加载之前分配适当的数据类型来优化我的数据框。但到目前为止,我发现我只能在加载数据框后优化数据类型,我可以从下面的代码中看到这种情况。因此,如果有任何其他方法可以尽早分配数据类型,这将真正帮助我管理代码的内存需求。

dbdf = pd.DataFrame(columns=['ID', 'Incr', 'Found'])
dbdf = dbdf.astype({'ID': str, 'Incr': np.int16, 'Found': str})

dbdf = pd.read_sql(
    'SELECT substring_index(ID, \'.\', 2) as ID, Incr, \'Y\' as Found FROM database.',
    conn, coerce_float=True)  # database dataframe

print('$$$$$BEFORE$$$$$')
print(dbdf.memory_usage())
print(dbdf.dtypes)

print('$$$$$AFTER$$$$$')
dbdf = dbdf.astype({'ID': np.float64, 'Incr': np.int16, 'Found': str})
print(dbdf.memory_usage())
print(dbdf.dtypes)

以下是结果

$$$$$BEFORE$$$$$
ID        6695328
Incr    6695328
Found      6695328
dtype: int64
ID        object
Incr     int64
found      object

$$$$$AFTER$$$$$
ID        6695328
Incr    1673832
Found      6695328
dtype: int64
ID        float64
Incr      int16
Found       object

【问题讨论】:

  • 我很好奇,将 ID 设为 float64 而不是字符串能节省多少?
  • 我似乎找不到“字符串”类型来查看,即使我的代码指定了“str”,所以我可以告诉那里的保存,但即使是“Incr”,我也没有得到那些在加载期间保存,我只能在加载 df 后执行此操作。我正在加载一个表,只是上面的列,大约有 5.6 亿条记录,我的 8GB 内存容器快用完了。我很确定我可以设法将它加载到给定的内存中,但似乎无法分配正确的类型。
  • 如果您能够在单个节点上将 5.6 亿条记录加载到 8 gig 的 ram 中,那么您就是我的英雄
  • 哈哈哈 :) 谢谢你扼杀了我的希望。顺便说一句,我刚开始使用 Python 和数据框。关于如何将由 ID(样本值:'2287.99999')+ Incr(样本值:345362)和 Found(样本值:'Y')组成的 5.6 亿条记录放入数据框中的任何建议。

标签: python pandas dataframe memory types


【解决方案1】:

如果你想在加载之前指定列的类型,那么有两个选项(据我所知:P)。

  1. 在读取sql数据时使用cast指定列的类型。 (我不了解sql,所以我不确定语法,很抱歉)

'SELECT cast (ID as float64()), cast (Incr as int()) FROM database'

refer the link

  1. 使用 dtype 参数指定列的类型。

pd.read_csv('file.csv', dtype={'ID': str, 'Incr': np.int16, 'Found': str}, conn, coerce_float=True)

希望对你有帮助:)

【讨论】:

  • 嗨,我已经尝试在数据库中进行投射。 Panadas 在加载期间仍然应用它“默认”类型。对于第二个选项,我认为您对 read_csv 有误,因为该函数具有 dtype 参数,而 read_sql 没有这样的参数。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2021-11-09
  • 2020-01-14
  • 2021-10-21
相关资源
最近更新 更多