在数据帧平均几个值,以填补在同一列NaN值

问题描述 投票:0回答:3

我有一个数据帧,其中在一周小时的时间间隔中的数据的进行,但其中一列有几个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)

这是在返回前4行这是有道理的,为什么我得到这个结果列6,但我不知道如何使用它调用4行的NaN后取它们的平均值。

python pandas dataframe
3个回答
2
投票

您可以使用rollingn的窗口拿到以前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'])

使用5滚动窗口获取当前指数的平均值,和前一4。

输出:

    col1    rollmean5
0   1.0     1.00
1   2.0     1.50
2   3.0     2.00
3   4.0     2.50
4   5.0     3.00
5   6.0     4.00
6   4.5     4.50
7   8.0     5.75
8   9.0     7.00
9   10.0    8.25

很显然,当您完成后可能降至新建rollmean5


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列。


0
投票

利用乔彭定康提供的代码上面的工作太棒了,直到我列的第一行中有一个为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))
© www.soinside.com 2019 - 2024. All rights reserved.