【问题标题】:Replace NaN value with a median of all rows but select only some rows?用所有行的中位数替换 NaN 值,但只选择一些行?
【发布时间】:2020-11-19 06:42:52
【问题描述】:

这是对我之前的 questions 的跟进,但我知道需要添加特定行的选择以应用更改的值。

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)), 'Variant' : ["Red", "Blue", "Blue", "Yellow","Blue", "Blue", "Yellow", "Blue", "Yellow","Blue", "Red", "Red", "Red", "Red","Blue", "Blue",  "Yellow","Red",  "Yellow", "Yellow"]}) 
df.Dist[df.Dist<=-0.6] = np.nan
df.Val[df.Val<=-0.5] = np.nan

生成此数据:

我得到了这个很棒的解决方案:

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

但现在我不知道如何做到这一点,以便在列中的所有值中计算每小时的中位数,但仅用于在变量列中填充红色的值? 同样,这是整个每个 Dist 和 Val 列的中位数。 这样可以使 NaN 值保留在黄色和蓝色行中。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    从 Red Variants 获取索引,然后使用 Variant 列以及groupby 计算中位数,然后仅更新您的目标索引。

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

    输出:

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

    注意:看到除了“红色”之外的其他 Variant 没有更新,只有 NA 的红色也没有更新。

    【讨论】:

    • 非常感谢,尤其是我不知道的.eq
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 2021-02-27
    • 2022-07-06
    • 2015-01-18
    • 2020-12-24
    • 1970-01-01
    • 2010-09-16
    • 2014-06-16
    相关资源
    最近更新 更多