首页 > 解决方案 > 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: '-'

谢谢你的帮助。

标签: pythonpandasdataframe

解决方案


正如@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

推荐阅读