熊猫:在用作零时替换“-”,而在用作负数时则不能替换

时间:2018-10-01 15:41:42

标签: python pandas dataframe

我正在将csv文件读取到熊猫数据框中。

df= pd.read_csv("table.csv", encoding = 'ISO-8859-1')

我有一个名为“值”的列,当值为零时包含“-”。我的目的是过滤出此列中值为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: '-'

感谢您的帮助。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

如果您尝试过滤出值为“ nil”的行,那么如果我理解正确的话,可以节省一些步骤:

输入df:

   Row Value
0    1     -
1    2    -8
2    3     4
3    4     8
4    5     -
5    6   -17
6    7    12
7    8     0

这包含您所有的测试用例。过滤步骤为1个衬里:

df.loc[df['Value'] != '-']

输出:

   Row Value
1    2    -8
2    3     4
3    4     8
5    6   -17
6    7    12
7    8     0

如您所见,它消除了两个等于“-”但保留负数的实例,这使您免于进行任何类型的转换……df.loc按列逐行过滤“价值”。

答案 2 :(得分:0)

尝试

 nil_mask = df['value'] == '-'
 df['value'][nil_mask] = 0

这仅设置为零,且整个值均为'-',这行得通吗?

答案 3 :(得分:0)

您可以使用申请。 试试:

def replace_val(val):
    if val == '-':
        return 0
    return val

df['value'] = df['value'].apply(replace_val)

答案 4 :(得分:0)

在使用大熊猫时,您可以将字符串强制转换为数字,并且通过“-”标识的空值将被强制转换为NaN,而“ -4”将变为-4的整数。

test = pd.DataFrame([['-', '-2', '-', '0'],
                   ['3', '4', '-', '-1'],
                   ['-', '-', '-', '5'],
                   ['-', '-3', '-', '4']],
                   columns=list('ABCD'))

test.apply(pd.to_numeric, args=('coerce',))

您应该回来:

     A    B   C  D
0  NaN -2.0 NaN  0
1  3.0  4.0 NaN -1
2  NaN  NaN NaN  5
3  NaN -3.0 NaN  4