Pandas 如何通过循环填充DataFrame中相邻列的平均值来填充NaN值
我有一个大的数据集,我有一些缺少的值,我想用前后列的平均值填充NAN值,在某些情况下,我有连续的NAN值。在这些情况下,我想用非NAN的第一个值替换所有的NAN值。例如:我应该使用循环Pandas 如何通过循环填充DataFrame中相邻列的平均值来填充NaN值,pandas,dataframe,rows,mean,Pandas,Dataframe,Rows,Mean,我有一个大的数据集,我有一些缺少的值,我想用前后列的平均值填充NAN值,在某些情况下,我有连续的NAN值。在这些情况下,我想用非NAN的第一个值替换所有的NAN值。例如:我应该使用循环 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 19.0 NaN NaN NaN 29.0 30.0 NaN 16.0 15.0 16.0 17.0 NaN 28.0 30.0 NaN
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
19.0 NaN NaN NaN 29.0 30.0 NaN 16.0 15.0 16.0 17.0 NaN 28.0 30.0 NaN 28.0 18.0
目标是使数据看起来像这样:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
19.0 29.0 29.0 29.0 29.0 30.0 23.0 16.0 15.0 16.0 17.0 22.5 28.0 30.0 29 28.0 18.0
让
那么你要找的东西可以用
subset_ranges = [0, 3]
replacements = {}
for i in range(len(l)-1):
subset = l[subset_ranges[0]: subset_ranges[1]]
if pd.isnull(subset[1]) and not pd.isnull(subset[0]) and not pd.isnull(subset[2]):
replacements[subset_ranges[0]+1] = np.nanmean(subset)
subset_ranges[0] += 1
subset_ranges[1] += 1
l = np.array([e if i not in replacements.keys() else replacements[i] for i, e in enumerate(l)])
df = pd.DataFrame(l.reshape(-1, 1))
df.fillna(method='bfill', inplace=True)
让我们试试:
# where df is not null
s = df.notna()
# check for `NaN` with valid left and right:
mask = s.shift(1, axis=1) & s.shift(-1, axis=1)
# fill as required
df[:] = np.where(mask, df.interpolate(axis=1), df.bfill(axis=1).ffill(axis=1))
输出:
0 1 2 3 4 5 6 7 8 9 10 11 \
0 19.0 29.0 29.0 29.0 29.0 30.0 23.0 16.0 15.0 16.0 17.0 22.5
12 13 14 15 16
0 28.0 30.0 29.0 28.0 18.0
你有什么理由要输入平均值吗?如果在19到29岁之间有:21.5、24和26.5。你会接受吗?我有一个数据框(2592行×18列)不是一个系列我怎么能做到这些?
0 1 2 3 4 5 6 7 8 9 10 11 \
0 19.0 29.0 29.0 29.0 29.0 30.0 23.0 16.0 15.0 16.0 17.0 22.5
12 13 14 15 16
0 28.0 30.0 29.0 28.0 18.0