python - Pandas:用作零时替换“-”,但用作负数时不替换
问题描述
我正在将 csv 文件读入 pandas 数据框。
df= pd.read_csv("table.csv", encoding = 'ISO-8859-1')
我有一个名为“值”的列,当值为 nil 时,它包含“-”。我的目标是过滤掉该列中值为 nil 的所有行。
但是,当值为负时,也包含符号。
当我尝试:
df['value'] = df['value'].str.replace(',', '')
df['value'] = df['value'].str.replace('-', '0')
df['value'] = df['value'].astype(str).astype(float)
df= df[df['value'] !=0]
当我去掉负号时,所有负数都变成正数。
但是,如果我不将“-”转换为“0”,则会收到错误消息:
ValueError: could not convert string to float: '-'
谢谢你的帮助。
解决方案
正如@Allolz 所指出的,要摆脱,
千位分隔符,请使用以下thousands
参数pd.read_csv()
:
df= pd.read_csv("table.csv", thousands=',', encoding = 'ISO-8859-1')
如果我理解正确,最简单的方法是使用pd.to_numeric
,它可以将所有非数字转换为NaN
,然后您可以将其替换为 0:
df['value'] = pd.to_numeric(df.value,errors='coerce').fillna(0)
例子:
df = pd.DataFrame({'value':['-','-0.5','0.5','-']})
>>> df
value
0 -
1 -0.5
2 0.5
3 -
df['value'] = pd.to_numeric(df.value,errors='coerce').fillna(0)
>>> df
value
0 0.0
1 -0.5
2 0.5
3 0.0
但如果你愿意,你也可以使用replace
代替str.replace
, 来替换完整的字符串而不是子字符串:
df['value'] = df['value'].replace('-',0).astype(float)
例子:
>>> df
value
0 -
1 -0.5
2 0.5
3 -
df['value'] = df['value'].replace('-',0).astype(float)
>>> df
value
0 0.0
1 -0.5
2 0.5
3 0.0
推荐阅读
- r - 计算并绘制来自 FE logit 模型预测变量的所有可能级别和值的预测值
- drake - 计算由 Drake 中的 ExternallyAppliedSpatialForces 引起的广义力,例如由于 Propeller
- python - 如何将一系列文件作为一个文件读取(文件输入缺少读取)?
- makefile - Raylib Makefile 问题
- reactjs - 如何在前端(在 React 中)上传文件并将它们发送到后端(Laravel/API)?
- liquibase - Liquibase GenerateChangeLog 在更改日志文件中不包含 schemaName
- ios - NSObject 委托方法没有被调用
- datetime - ACF 时间和日期选择器的 2 种返回格式
- php - 可以从类外部覆盖 __get
- android - 如何使用 android 应用从服务器获取更新?