我正在将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: '-'
感谢您的帮助。
答案 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