我有许多具有相同列标题的CSV文件要解析.在这些文件中,可能有几种模式来表示NA,例如:" - "," - ","/",......
我不知道所有的模式,所以我不能正确设置na_values参数read_csv().
有没有快速的方法来查找这些文件中的所有NA模式,或者不知道所有模式,我仍然可以将所有列转换为数字?这是我尝试过的:
patterns = set()
for i, fn in enumerate(glob(u"data/*.csv")):
df = pd.read_csv(fn, encoding="utf-8-sig", usecols=cols, dtype=str, keep_default_na=False)
df_num = df.convert_objects(convert_numeric=True)
patterns.update( df[df_num.isnull()].stack().value_counts().index )
Run Code Online (Sandbox Code Playgroud)
但是convert_objects()很慢.这是一些测试:
read_csv(dtype=str):约2.2秒read_csv()没有dtype争论:大约2.5sread_csv(dtype=str)+ convert_objects():8.4s因此,read_csv()可以非常快速地将字符串转换为数字convert_objects().但是如果有一个元素无法转换为数字,则整个列将成为字符串列.
有没有更快的方法可以将所有列转换为数字而不设置na_values参数?
为什么不将“index_col”参数设置为 False。我相信,这将导致 pandas 从零开始按顺序对列进行编号。更改后您的代码将如下所示:
patterns = set()
for i, fn in enumerate(glob(u"data/*.csv")):
df = pd.read_csv(fn, encoding="utf-8-sig", index_col=False, usecols=cols, dtype=str, keep_default_na=False)
df_num = df.convert_objects(convert_numeric=True)
patterns.update( df[df_num.isnull()].stack().value_counts().index )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |