处理python中数据集中的缺失值

时间:2018-05-29 06:44:12

标签: python pandas data-cleaning

如何选择是删除NaN值还是用数据集中的均值(或中位数)填充?还有什么其他技术可以清理数据集中的缺失值? 让数据为数字。(在python中)

2 个答案:

答案 0 :(得分:1)

它始终取决于您的数据集和缺失值的百分比。

对于一小部分缺失值,删除NaN值是可接受的解决方案。如果百分比不可忽略,则强烈建议不要放弃NaN。 然后填充类型取决于数据类型。如果您的缺失值应该在已知的小范围内,那么您可以填写其他值的平均值。例如,如果您的数据集包含学校中学生的年龄(但缺少许多这些值),则平均值不应对某些分析产生问题。 另一方面,如果您有一系列增加的测量时间很慢,您可以考虑用向前或向后填充替换NaN值。 例如,在下面的情况中,df.fillna(method='ffill')应该优于df.fillna(df.mean())

                    A       
01-01-2018 00:00  0.1   
01-01-2018 00:01  0.1   
01-01-2018 00:02  NaN   
01-01-2018 00:03  0.1  
01-01-2018 00:04  0.2  
01-01-2018 00:05  0.2  

但在另一个例子中,用平均值替换会更好:

             Age    Class
StudentA    15.3       10   
StudentB    16.1       10
StudentC    15.5        9
StudentD     NaN       10
StudentE    16.0       10

同样,没有一般规则,但这取决于您的数据集和您必须进行的分析。

答案 1 :(得分:0)

处理缺失数据没有具体规则。但是,您可能需要考虑以下事项:

1。如果列的数据缺失值超过70%,则可能需要删除该列。

2。如果列数据的分布本质上是对称的,您可以考虑用mean:

替换缺失值
test['A'].fillna(test.groupby('Group')['A'].transform('mean'), inplace=True)
test
    A           B   Group
0   1.000000    1   c
1   2.000000    4   d
2   5.666667    5   d
3   3.000000    7   c
4   4.000000    12  d
5   7.000000    45  c
6   11.000000   6   d

或者您可以对数据进行分组并使用分组均值:

class Parcel(models.Model):
    name = models.CharField(max_length=NAME_MAX_LENGTH)
    garden = models.ForeignKey(Garden, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Bed(models.Model):
    parcel = models.ForeignKey(Parcel, on_delete=models.CASCADE)
    name = models.CharField(max_length=NAME_MAX_LENGTH)
    length = models.IntegerField()
    width = models.IntegerField()

3。如果列的数据偏斜,您可以考虑使用中值来填充缺失值。 (在上面的命令中将'mean'替换为'median'。)

4。或者,您也可以查看像聚类这样的无监督方法。这里,一旦您的数据被群集,您可以使用模式值或群集的平均值并相应地替换丢失的数据。

希望这有帮助。