我有一个数据帧,其中在一周小时的时间间隔中的数据的进行,但其中一列有几个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后取它们的平均值。
您可以使用rolling
与n
的窗口拿到以前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
。
这应该工作?不知道是否有已建成大熊猫的东西。不得不忽略那里有不为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列。
利用乔彭定康提供的代码上面的工作太棒了,直到我列的第一行中有一个为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))