首页 > 解决方案 > 基于某些条件的平均插补

问题描述

我有以下数据框,

Category    Value
A           100
A           -
B           -
C           50
D           200
D           400
D           -

如您所见,有些值带有连字符“-”。我想用相应类别的手段替换那些连字符。

在示例中,“A”有两个条目 - 一行的值为 100,另一行带有连字符。所以平均值本身就是 100。对于 B,由于没有有效值,平均值将是整个列的平均值,即 (100+50+200+400/4 = 187.5)。对于 C,没有更改,对于 D,连字符将替换为 300(与“A”的逻辑相同)。

输出:

Category    Value
A           100
A           100
B           187.5
C           50
D           200
D           400
D           300

标签: python-3.xpandasdataframe

解决方案


尝试:

df = df.replace("-", np.nan)
df["Value"] = pd.to_numeric(df["Value"])

avg = df["Value"].mean()

df["Value"] = df["Value"].fillna(
    df.groupby("Category")["Value"].transform(
        lambda x: avg if x.isna().all() else x.mean()
    )
)
print(df)

印刷:

  Category  Value
0        A  100.0
1        A  100.0
2        B  187.5
3        C   50.0
4        D  200.0
5        D  400.0
6        D  300.0

推荐阅读