Pandas:在用作零时替换“-”,但在用作负数时不替换

Gav*_*vin 1 python dataframe pandas

我正在将 csv 文件读入熊猫数据帧。

df= pd.read_csv("table.csv", encoding = 'ISO-8859-1')
Run Code Online (Sandbox Code Playgroud)

我有一个名为“value”的列,当值为 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]
Run Code Online (Sandbox Code Playgroud)

当我去掉负号时,所有负数都变成正数。

但是,如果我不将“-”转换为“0”,则会出现错误:

ValueError: could not convert string to float: '-'
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

sac*_*cuL 5

正如@Allolz 所指出的,要摆脱,千位分隔符,请使用以下thousands参数pd.read_csv()

df= pd.read_csv("table.csv", thousands=',', encoding = 'ISO-8859-1')
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,最简单的方法是使用pd.to_numeric,它可以将所有非数字转换为NaN,然后您可以将其替换为 0:

df['value'] = pd.to_numeric(df.value,errors='coerce').fillna(0)
Run Code Online (Sandbox Code Playgroud)

例子:

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
Run Code Online (Sandbox Code Playgroud)

但是,如果您愿意,也可以使用replace代替str.replace, 来替换完整字符串而不是子字符串:

df['value'] = df['value'].replace('-',0).astype(float)
Run Code Online (Sandbox Code Playgroud)

例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)