我有一个要清理的数据集。数据均为数字。基本上,如果有一个小于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
谢谢。
答案 0 :(得分:1)
也许这可以帮助您。
您可以将DataFrame
与rolling_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)