【发布时间】:2020-01-06 17:05:46
【问题描述】:
我有一个相当大的 csv 文件,其中包含从用于材料测试(压缩测试)的机器获得的数据。数据的标题是 Time、Force、Stroke,由于样本量的原因,它们重复了 10 次,所以最后一组标题是 Time.10、Force.10、Stroke.10。由于实验的性质,并非所有列的长度都相同(有些比其他列长约 2000 行)。当我使用 pandas 将文件导入我的 IDE(spyder 或 jupyter)时,csv 文件中空行中的所有单元格都标记为 NaN。问题是......我不能在具有 NaN 值的列内或列之间进行任何数学运算,因为它们被视为 str。我在几乎所有论坛上都尝试过最推荐的解决方案; .fillna()、dropna()、replace() 和 interpolate()。上述方法有效,但仅在视觉上有效,例如df.fillna(0) 用 0 替换所有 NaN 值,但是当我尝试例如在列中找到最大值,我仍然收到错误消息,指出我的列中有字符串(TypeError: '>' not supported between 'float' and 'str')。 NaN 值 100% 导致问题是 csv 文件中的空单元格的结果,因为我已经导入了一个 csv 文件,其中所有列的长度相同(没有空单元格)并且没有问题。如果有人对此问题有任何解决方案(不需要在 pandas 中,只需在 python 中)我被困了 2 周以上,我将不胜感激。
【问题讨论】:
-
na_values选项可能对 pandas 有用read_csv(pandas.pydata.org/pandas-docs/stable/reference/api/…) -
我认为您的数据中可能存在其他问题。
fillna()正常工作的事实意味着这些值实际上是NaN值,而不是字符串'nan',它是float()类型,并且允许您进行数学运算。您是否检查过其他字符串值?[i for i in df['column'] if isinstance(i,str)] -
@G.Anderson 是的,我的文件中没有字符串。这些值是 NaN,但我文件中的数值都是十进制数。也许这是我的问题,是否应该将 NaN 转换为 nan ......例如0.0 而不是用 0 替换 NaN?
-
解决了!对我有用的解决方案是:df.fillna(method="ffill")。我不是专业人士(显然),所以我不能告诉你为什么只有这种方法有效,但它确实有效。
-
@lignum 使用 'ffill' 来填充空单元格会在其中添加错误值,并且会破坏这些列上的数学计算