【发布时间】:2018-10-16 19:20:45
【问题描述】:
我有一个 10 GB 的 csv 文件,其中包含 170,000,000 行和 23 列,我将其读入数据框,如下所示:
import pandas as pd
d = pd.read_csv(f, dtype = {'tax_id': str})
我还有一个包含近 20,000 个独特元素的字符串列表:
h = ['1123787', '3345634442', '2342345234', .... ]
我想在数据框d 中创建一个名为class 的新列。只要d['tax_id'] 具有在字符串列表h 中找到的值,我就想分配d['class'] = 'A'。否则,我想要d['class'] = 'B'。
以下代码在我的数据框d 的 1% 样本上运行得非常快:
d['class'] = 'B'
d.loc[d['tax_num'].isin(h), 'class'] = 'A'
但是,在完整的数据帧 d 上,此代码需要 48 小时(并且还在继续)才能在 32 核服务器上以批处理模式运行。我怀疑使用loc 进行索引会减慢代码速度,但我不确定它到底是什么。
总之:有没有更有效的方法来创建class 列?
【问题讨论】:
-
Pandas 无法处理那么多数据。查看
dask。 -
另一个问题,你的税号是唯一的吗?
-
不确定这是否更好,但尝试使
h列表成为在h内容上索引的第二个数据帧,然后使tax_num成为d上的索引,然后尝试join(). -
@coldspeed 是的,我在列表 h 中的税号是唯一的。
-
是的,pandas 支持非唯一索引。
标签: python pandas select indexing