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


问题内容

是否可以将CSV作为大熊猫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:

用熊猫读取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)

问题答案:

熊猫会自动使用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

另外,您可以通过传递字典为每列设置不同的值。假设我们有以下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