我有一个导出的Excel CSV文件与str(date), str, float, float, float, float, int
作为列值。有些Excel单元格是空的,因此需要使用keep_default_na
。有些在双引号中,有上千个分隔符。参数的数量似乎使pandas解析器感到困惑,因为运行以下输出:
ValueError:无法将字符串转换为float: '1,917.6'
似乎当keep_default_na
存在时,thousands
被忽略。当我在csv中没有任何,,,,,,
行时运行它,它工作得很好。
CSV文件:
TS
Date,Symbol,Open,High,Low,Close,Volume
6/14/2022 23:59,A,918.1,918.1,918.1,918.1,1
,,,,,,
6/14/2022 23:57,A,"1,917.6",917.6,917.6,917.6,1
,,,,,,
,,,,,,
代码df = pd.read_csv('test.csv',
skiprows=1,
quotechar='"',
thousands=',',
keep_default_na=False,
dtype = {'Open': np.float64, 'High': np.float64,
'Low': np.float64, 'Close': np.float64,
'Volume': np.uint32, 'Symbol': 'string'})
我认为问题可能是报告哪些值是问题的例程不像完整的解析引擎那样复杂-我认为您在每个列中都有多个dtype问题,而pandas告诉您错误的值是实际问题。浮动列不能有值"(因此它需要包含在na_values列表中),并且int列不能有NA值,因此您要么需要跳过页脚,要么提供na_values
并使用float dtypes。以下两个都适合我:
skipfooter与你的参数一起工作,但返回到python引擎:
In [26]: df = pd.read_csv('test.csv',
...: skiprows=1,
...: quotechar='"',
...: thousands=",",
...: keep_default_na=False,
...: dtype = {'Open': np.float64, 'High': np.float64,
...: 'Low': np.float64, 'Close': np.float64,
...: 'Volume': np.uint32, 'Symbol': 'string'},
...: skipfooter=2,
...: )
或者,您可以使用float列阅读并指定["]作为na_value:
In [29]: df = pd.read_csv('test.csv',
...: skiprows=1,
...: quotechar='"',
...: thousands=",",
...: keep_default_na=False,
...: dtype = {'Open': np.float64, 'High': np.float64,
...: 'Low': np.float64, 'Close': np.float64,
...: 'Volume': np.float32, 'Symbol': 'string'},
...: na_values=[""],
...: )
此时,您可以根据您喜欢的任何条件删除行,例如,删除'Volume'
中具有nan的行,然后转换为int:
In [30]: df = df[df.Volume.notnull()]
In [31]: df["Volume"] = df["Volume"].astype(int)
或者,您可以设置无效的值标记,例如:
In [32]: df["Volume"] = df["Volume"].fillna(-9999).astype(int)