熊猫-如何根据接下来的10个细胞的平均值来更换细胞

时间:2018-07-27 22:06:19

标签: python pandas

我有一个要清理的数据集。数据均为数字。基本上,如果有一个小于0或大于100的单元格,我想将其设置为NaN。我用以下代码解决了这个问题:

    for col in df:
        df.loc[df[col] < 0, col] = numpy.NaN
        df.loc[df[col] > 100, col] = numpy.NaN

对于大于0但小于20的值,我需要检查其上方和下方的10个单元格。如果该值与上方或下方同一列中10个单元格的平均值相差20个以上,则还应将其设置为numpy.NaN。

我不确定在阅读documentation之后该如何做,我知道我可以简单地将一个函数传递到df.loc []中,该函数返回一个布尔值列表。但是,我不确定如何访问传入的值的索引来检查上方和下方的10个值。我认为它看起来像这样,但是我什至不确定这是否会按照pd.df.loc []的需要正确生成布尔列表。

    def myFunc(value):
        #access index and create avgs for both tenBefore and tenAfter
        if abs(tenBeforeAvg - value) > 20 or abs(tenAfterAvg - value) > 20:
             return False
        else: 
             return True

    for col in df:
        df.loc[df[col] < 0, col] = numpy.NaN
        df.loc[df[col] > 100, col] = numpy.NaN
        df.loc[myFunc(df[col]), col] = numpy.NaN

谢谢。

1 个答案:

答案 0 :(得分:1)

也许这可以帮助您。

您可以将DataFramerolling_mean DataFrame进行比较,然后将上下两个平均值进行反向比较。 但是,由于数据框中的NaNs,并不总是可以计算平均值,因此您可以确保无论使用min_periods都可以计算得出平均值。

请检查它是否正确,如我所不知道。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(-10, 110, (100, 3)))
#remove those higher than 100, lower than 0.
df[(df < 0) | (df > 100)] = np.nan
mean_desc = df.rolling(10, min_periods=1).mean()
mean_asc = df[::-1].rolling(10, min_periods=1).mean() # reversed rolling avg.
mean_asc.index = mean_desc.index
df[(df < 20) & (df > 0) & (df > mean_desc - 20) & (df < mean_desc + 20) & (df > mean_asc - 20) & (df < mean_asc + 20)] = "np.nan" # <-- replace with np.nan

print(df)