如何在不知道NA值模式的情况下快速将列转换为数字

HYR*_*YRY 5 csv pandas

我有许多具有相同列标题的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.5s
  • read_csv(dtype=str)+ convert_objects():8.4s

因此,read_csv()可以非常快速地将字符串转换为数字convert_objects().但是如果有一个元素无法转换为数字,则整个列将成为字符串列.

有没有更快的方法可以将所有列转换为数字而不设置na_values参数?

Ale*_*lex 0

为什么不将“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)