在 python dask 中使用分隔符读取 csv
Posted
技术标签:
【中文标题】在 python dask 中使用分隔符读取 csv【英文标题】:Reading csv with separator in python dask 【发布时间】:2016-03-19 21:19:09 【问题描述】:我正在尝试通过读取由 '#####' 5 个哈希分隔的 csv 文件来创建 DataFrame
代码是:
import dask.dataframe as dd
df = dd.read_csv('D:\temp.csv',sep='#####',engine='python')
res = df.compute()
错误是:
dask.async.ValueError:
Dask dataframe inspected the first 1,000 rows of your csv file to guess the
data types of your columns. These first 1,000 rows led us to an incorrect
guess.
For example a column may have had integers in the first 1000
rows followed by a float or missing value in the 1,001-st row.
You will need to specify some dtype information explicitly using the
``dtype=`` keyword argument for the right column names and dtypes.
df = dd.read_csv(..., dtype='my-column': float)
Pandas has given us the following error when trying to parse the file:
"The 'dtype' option is not supported with the 'python' engine"
Traceback
---------
File "/home/ec2-user/anaconda3/lib/python3.4/site-packages/dask/async.py", line 263, in execute_task
result = _execute_task(task, data)
File "/home/ec2-user/anaconda3/lib/python3.4/site-packages/dask/async.py", line 245, in _execute_task
return func(*args2)
File "/home/ec2-user/anaconda3/lib/python3.4/site-packages/dask/dataframe/io.py", line 69, in _read_csv
raise ValueError(msg)
那么如何摆脱它。
如果我遵循错误,那么我将不得不为每一列提供 dtype,但如果我有 100 多列,那么这是没有用的。
如果我在没有分隔符的情况下阅读,那么一切都很好,但到处都有#####。那么在计算到 pandas DataFrame
之后,有没有办法摆脱它?
所以请帮帮我。
【问题讨论】:
这里的引擎是不是特别需要通过python?默认不会是c
,如果你将它设置为c
,它会起作用吗?
@EdChum-当我尝试在没有引擎的情况下读取 csv 时收到警告 /home/ec2-user/anaconda3/lib/python3.4/site-packages/pandas/io/parsers.py: 648:ParserWarning:回退到“python”引擎,因为“c”引擎不支持正则表达式分隔符;您可以通过指定 engine='python' 来避免此警告
如何将 sep 设置为 sep=r'#####'
与 sep=r'#####' 相同的错误
一个选项是只读取第一行,然后重新读取 df 再次传递 dtypes:dtypes_dict = dd.read_csv('D:\temp.csv',sep='#####',engine='python', nrows=2).dtypes.to_dict()
然后再次读取:df = dd.read_csv('D:\temp.csv',sep='#####',engine='python', dtypes = dtypes_dict)
【参考方案1】:
以dtype=object
读取整个文件,这意味着所有列都将被解释为object
类型。这应该正确读入,去掉每一行中的#####
。从那里您可以使用compute()
方法将其变成熊猫框架。一旦数据在 pandas 框架中,您可以使用 pandas infer_objects
方法来更新类型,而无需对它们进行硬编码。
import dask.dataframe as dd
df = dd.read_csv('D:\temp.csv',sep='#####',dtype='object').compute()
res = df.infer_objects()
【讨论】:
【参考方案2】:如果您想将整个文件保留为 dask 数据帧,我只需增加在read_csv
中采样的字节数,就可以在具有大量列的数据集上取得一些成功。
例如:
import dask.dataframe as dd
df = dd.read_csv('D:\temp.csv', sep='#####', sample = 1000000) # increase to 1e6 bytes
df.head()
这可以解决一些类型推断问题,尽管与 Benjamin Cohen 的回答不同,您需要找到正确的值来选择样本/
【讨论】:
以上是关于在 python dask 中使用分隔符读取 csv的主要内容,如果未能解决你的问题,请参考以下文章
在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame