在数据框中缺少特征的位置将Nan替换为0

时间:2018-11-15 17:49:58

标签: python pandas

我正在处理缺少值的数据集。数据集的标题如下:

+1 1:0.2 2:0.7 3:-1.2 4:0.5
-1 1:0.9 3:0.1 4:0.8
-1 1:-0.1 2:0.1 4:1.0
+1 2:0.6 3:-1.0

第一列是数据的标签,冒号前面的数字是要素的索引。某些行缺少某些功能。因此,当我使用以下代码导入数据时,

df = pandas.read_csv('dataset',header=None,sep = '\s+|:',engine='python',dtype=float)

我得到的数据框看起来像

    0       1       2       3       4       5       6       7       8
0   1.0     1.0     0.2     2.0     0.7     3.0     -1.2    4.0     0.5
1   -1.0    1.0     0.9     3.0     0.1     4.0     0.8     NaN     NaN
2   -1.0    1.0     -0.1    2.0     0.1     4.0     1.0     NaN     NaN
3   1.0     2.0     0.6     3.0     -1.0    NaN     NaN     NaN     NaN

我想在正确的位置将NaN替换为0。但是,如果我使用df.fillna(0),我将在每一行的末尾替换NaN,看起来像

    0       1       2       3       4       5       6       7       8
0   1.0     1.0     0.2     2.0     0.7     3.0     -1.2    4.0     0.5
1   -1.0    1.0     0.9     3.0     0.1     4.0     0.8     0.0     0.0
2   -1.0    1.0     -0.1    2.0     0.1     4.0     1.0     0.0     0.0
3   1.0     2.0     0.6     3.0     -1.0    0.0     0.0     0.0     0.0

我真正想要的是一个数据框,看起来像这样,

    0       1       2       3       4       5       6       7       8
0   1.0     1.0     0.2     2.0     0.7     3.0     -1.2    4.0     0.5
1   -1.0    1.0     0.9     0.0     0.0     3.0     0.1     4.0     0.8
2   -1.0    1.0     -0.1    2.0     0.1     0.0     0.0     4.0     1.0
3   1.0     0.0     0.0     2.0     0.6     3.0     -1.0    0.0     0.0

所以在删除索引后我应该拥有

    0       1       2       3       4     
0   1.0     0.2     0.7     -1.2    0.5
1   -1.0    0.9     0.0     0.1     0.8
2   -1.0    -0.1    0.1     0.0     1.0
3   1.0     0.0     0.6     -1.0    0.0

1 个答案:

答案 0 :(得分:1)

问题不在于填充N / A值,正如@BurningKarl在评论中建议的那样,问题是试图以read_csv的形式读取文件,而该文件无论如何都不像csv或csv一样文件。您可能需要以其他方式解析此文件。

如果这可以帮助您入门,我在下面发布了一个代码段,该代码段显示了如何根据您的需要将格式化的数据提取到适当的数据框中。如果可以使用file.readlines将文件解析为词典列表,则可以将其包装在DataFrame构造函数中。 (请注意,此解析可能需要花费一些精力才能完全正确)

x=[{0:1,1:0.2, 2:0.7, 3:-1.2, 4:0.5},
{0:-1,1:0.9, 3:0.1, 4:0.8},
{0:-1,1:-0.1, 2:0.1, 4:1.0},
{0:1,2:0.6, 3:-1.0}]

pd.DataFrame(x)

给你

    0    1       2      3       4
0   1    0.2     0.7    -1.2    0.5
1   -1   0.9     NaN    0.1     0.8
2   -1   -0.1    0.1    NaN     1.0
3   1    NaN     0.6    -1.0    NaN

然后您就可以像以前一样填充(0)