首页 > 解决方案 > 在数据框中缺少功能的地方将 Nan 替换为 0

问题描述

我正在处理缺少值的数据集。数据集的头部如下所示:

+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

我想在正确的位置用 0 替换 NaN。但如果我使用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

标签: pythonpandas

解决方案


问题不在于填充 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

然后你可以像之前尝试过的那样填充na(0)


推荐阅读