平均数据框中的几个值以填充同一列中的NaN值

时间:2019-01-08 22:38:46

标签: python pandas dataframe

我有一个数据帧,其中数据以一小时为间隔进行,但是其中一列具有一些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行并将其平均。

3 个答案:

答案 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))