python - 用中位数替换 NaN 值?

标签 python pandas numpy data-cleaning

因此,我尝试使用 Pandas 将表中的所有 NaN 值替换为特定范围内的中值。我正在处理更大的数据集,但是例如

np.random.seed(0)
rng = pd.date_range('2020-09-24', periods=20, freq='0.2H')
df = pd.DataFrame({ 'Date': rng, 'Val': np.random.randn(len(rng)), 'Dist' :np.random.randn(len(rng)) }) 
df.Dist[df.Dist<=-0.6] = np.nan
df.Val[df.Val<=-0.5] = np.nan

Data

我想要做的是用该列每小时的中值替换 Val 和 Dist 的 NaN 值。我设法在单独的引用表中获得了中值:

df.set_index('Date', inplace=True)
df = df.assign(Hour = lambda x : x.index.hour)
df_val = df[["Val", "Hour"]].groupby("Hour").median()
df_dist = df[["Dist", "Hour"]].groupby("Hour").median()

Median Values

但是现在我已经以各种形式尝试了以下所有命令,但无法弄清楚如何填充 NaN 值。

df[["Val","Hour"]].mask(df['Val'].isna(), df_val.iloc[df.Hour], inplace=True)

df.where(df['Val'].notna(), other=df_val[df.Hour],axis = 0)

df["Val"] = np.where(df['Val'].notna(), df['Val'], df_val(df.Hour))

df.replace({"Val":{np.nan:df_val[df.Hour]}, "Dist":{np.nan:df_dist[df.Hour]}})

最佳答案

您可以使用 groupby.transform 和 fillna:

cols = ['Val','Dist']
df[cols] =  df[cols].fillna(df.groupby(df.Date.dt.floor('H'))
                              [cols].transform('median')
                           )

输出:

                  Date       Val      Dist
0  2020-09-24 00:00:00  1.764052  0.864436
1  2020-09-24 00:12:00  0.400157  0.653619
2  2020-09-24 00:24:00  0.978738  0.864436
3  2020-09-24 00:36:00  2.240893  0.864436
4  2020-09-24 00:48:00  1.867558  2.269755
5  2020-09-24 01:00:00  0.153690  0.757559
6  2020-09-24 01:12:00  0.950088  0.045759
7  2020-09-24 01:24:00 -0.151357 -0.187184
8  2020-09-24 01:36:00 -0.103219  1.532779
9  2020-09-24 01:48:00  0.410599  1.469359
10 2020-09-24 02:00:00  0.144044  0.154947
11 2020-09-24 02:12:00  1.454274  0.378163
12 2020-09-24 02:24:00  0.761038  0.154947
13 2020-09-24 02:36:00  0.121675  0.154947
14 2020-09-24 02:48:00  0.443863 -0.347912
15 2020-09-24 03:00:00  0.333674  0.156349
16 2020-09-24 03:12:00  1.494079  1.230291
17 2020-09-24 03:24:00 -0.205158  1.202380
18 2020-09-24 03:36:00  0.313068 -0.387327
19 2020-09-24 03:48:00  0.323371 -0.302303

关于python - 用中位数替换 NaN 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64859946/

相关文章:

python - PIL转换图片导致不好的结果

python , Pandas : return highest values from multiindex

python - Pandas 在多索引中连接级别

python - 检查终端中的 .csv 文件有多少行

python - 创建没有特定范围的数组

python - Numpy View Reshape Without Copy(二维移动/滑动窗口、步幅、屏蔽内存结构)

python - 围绕矩阵周长移动值 - Python/NumPy

python mechanize文件上传UnicodeDecode错误

python - 删除 pandas DataFrame 中的行,其中该行包含列表中存在的字符串?

python - 在 Linux 中拖放等效的批处理文件