pandas在csv列中读取为float并将空单元格设置为0

时间:2017-04-24 22:46:39

标签: python pandas

是否可以将CSV作为pandas DataFrame读取并在一行中将空格(或空单元格)设置为0?以下是问题的说明。

输入:

$ csvlook data.csv    
|------+---+------|
|  a   | b | c    |
|------+---+------|
|      | a | 0.0  |
|  0   | b | 1.0  |
|  1.5 | c | 2.5  |
|  2.1 | d | 3.0  |
|------+---+------|

我想要的:

python% print(df)
    a   b   c
0   0   a   0.0
1   0   b   1.0
2   1.5 c   2.5
3   2.1 d   3.0

我尝试过的事情:

df = pd.read_csv('data.csv', dtype={'a': float, 'b': str, 'c': float})

由于列a的第0行中的空白而吐出了一个ValueError:

ValueError: could not convert string to float: 

使用pandas读取CSV时有没有办法用0替换字符串?

生成测试数据的代码:

如果您想尝试一下,以下是我在上面的例子中用来生成测试数据的行:

import pandas as pd
df = pd.DataFrame({'a':[' ', 0, 1.5, 2.1], 'b':['a', 'b', 'c', 'd'], 'c': [0, 1, 2.5, 3]})
df.to_csv('data.csv', index=False)

3 个答案:

答案 0 :(得分:2)

Pandas将使用NaN自动读取空值,因此从那里填充fillna方法,设置所需的新值(在本例中为0)。

import pandas as pd

df = pd.read_csv('data.csv').fillna(value = 0)

哪个收益率:

     a  b    c
0  0.0  a  0.0
1  0.0  b  1.0
2  1.5  c  2.5
3  2.1  d  3.0

您还可以通过传递dict为每列设置不同的值。 想象一下,我们有以下csv文件:

     a    b    c
0  NaN    a  0.0
1  0.0    b  1.0
2  1.5  NaN  2.5
3  2.1    d  NaN

如果我们希望它与以前一样:

pd.read_csv('data.csv').fillna(value = {'a':0,'b':'c','c':3})

再次屈服:

     a  b    c
0  0.0  a  0.0
1  0.0  b  1.0
2  1.5  c  2.5
3  2.1  d  3.0

答案 1 :(得分:1)

几乎在一行中,并且在实际案例中可能不起作用。

您可以在read_csv

中设置要映射到NaN的缺失值
import pandas as pd
df = pd.read_csv('data.csv', na_values=" ")

产生

     a  b    c
0  NaN  a  0.0
1  0.0  b  1.0
2  1.5  c  2.5
3  2.1  d  3.0

然后,您可以运行fillna将NaN更改为.0

因此,以下行完成所有操作:

df = pd.read_csv('data.csv', na_values=" ").fillna(0)

给出

     a  b    c
0  0.0  a  0.0
1  0.0  b  1.0
2  1.5  c  2.5
3  2.1  d  3.0

答案 2 :(得分:0)

df.replace(r'\s+', 0, regex=True)

     a  b    c
0  0.0  a  0.0
1  0.0  b  1.0
2  1.5  c  2.5
3  2.1  d  3.0