我有一个数据帧,其中数据以一小时为间隔进行,但是其中一列具有一些NaN值。当我遇到NaN时,我希望代码对NaN之前四个小时进行平均,然后用该平均值代替NaN。
我厌倦了修改以下问题的答案:pandas DataFrame: replace nan values with average of columns,但此示例获取的是整个列的平均值,而不是列的一部分。
我的数据框:
0 1 2 ... 6 7 8
3 12:53 2.778 ... -12.2 -16.7 69%
4 11:53 3.611 ... NaN -17.2 73%
5 10:53 2.778 ... -13.7 -17.2 73%
6 09:53 3.611 ... -13.3 -17.2 73%
7 08:53 2.778 ... -12.8 -16.7 76%
…
74 13:53 0.278 ... -15 -17.2 83%
这是我修改后的尝试,以如下方式调用列中的最后4个:
for i in df.index:
df[6].fillna(df[6].iloc[0:3].mean(), inplace=True)
这将返回第6列的前4行,这很有意义,为什么我会得到该结果,但我不知道如何让它在NaN之后调用4行并将其平均。
答案 0 :(得分:2)
您可以在窗口class Article(models.Model):
mainpage = models.ForeignKey(MainPage, on_delete=models.CASCADE,)
path = models.CharField(max_length=100)
url = models.TextField
time = models.DateTimeField(default=datetime.now)
votes = models.IntegerField(default=0)
comments = models.IntegerField(default=0)
def __str__(self):
return self.path
@classmethod
def create(cls, mainpage, path, url, votes, comments):
article = cls(mainpage=mainpage,path=path,url=url,votes=votes,comments=comments)
return article
中使用Article.objects.create(mainpage=mainpage, path='/path', url='url', votes=10, comments=22)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Users/davea/Documents/workspace/mainarticles_project/venv/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/davea/Documents/workspace/mainarticles_project/venv/lib/python3.7/site-packages/django/db/models/query.py", line 411, in create
obj = self.model(**kwargs)
File "/Users/davea/Documents/workspace/mainarticles_project/venv/lib/python3.7/site-packages/django/db/models/base.py", line 485, in __init__
raise TypeError("'%s' is an invalid keyword argument for this function" % kwarg)
TypeError: 'url' is an invalid keyword argument for this function
来获取先前rolling
索引的滚动平均值,然后用这些值填充na:
n
使用5的滚动窗口可获取当前索引和前4个索引的平均值。
输出:
n
显然,您可以在完成后删除新创建的df = pd.DataFrame({'col1':[1,2,3,4,5,6,np.nan,8,9,10]})
df['rollmean5'] = df['col1'].rolling(5,center=False,min_periods=1).mean()
df['col1'] = df['col1'].fillna(df['rollmean5'])
。
答案 1 :(得分:1)
这应该起作用吗?不知道熊猫中是否已经内置了某些东西。不得不忽略前面没有4行的情况。
for i in df.index:
if i < 4:
pass
else:
df['6'].fillna(df.iloc[i-4:i,5].mean(), inplace=True)
请注意,看起来您的列'6'实际上具有索引5,这就是iloc对列使用5的原因。
答案 2 :(得分:0)
使用上面的Joe Patten提供的代码非常有效,直到我在该列的第一行中输入了NaN为止。为了解决这个问题,我正在检查第一个值是否为NaN,如果是,请反转数据框,并从下至上运行滚动平均值,然后重新定向至正确的位置。如果第一个值不是NaN,请运行滚动平均值代码。
if df.isnull().loc[3,6] == 'True':
df['rollmean5'] = df[6].loc[::-1].rolling(5,center=False,min_periods=1).mean()
df['rollmean5'] = df['rollmean5'].loc[::-1]
df[6] = df[6].fillna(round(df['rollmean5'],2))
else:
df['rollmean5'] = df[6].rolling(5,center=False,min_periods=1).mean()
df[6] = df[6].fillna(round(df['rollmean5'],2))