Pandas 分组和转换忽略 NaN

sgo*_*les 5 python numpy dataframe pandas pandas-groupby

我面临着对数据框中的非 NA 值进行分组和转换的问题。

所以我的数据框是这样的:

姓名 价值
A 1
A 2
A
3
7
9

我想要的最终输出:

姓名 价值 重量1 重量2
A 1 0.33 0.5
A 2 0.33 0.5
A 0.33
3 0.25 0.33
7 0.25 0.33
9 0.25 0.33
0.25

我知道这可能听起来微不足道,但我无法让 Weight 2 在 column 的不同分组类别中完美运行Name

这是我获取专栏的方式Weight 1

df['Weight 1'] = df.groupby(['Name']).transform(lambda x: 1/len(x))
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试跟踪Weight 2,但引发了 DivisionByZero 警告。输出不正确。

df['Weight 2'] = df.groupby(['Name']).transform(lambda x: 1/np.sum(~np.isnan(x)))
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

Ch3*_*teR 5

您可以用来GroupBy.count计算每组中的非 NaN 值。然后pd.Series.map使用pd.Series.mask

mapping = (1 / df.groupby('Name')['Value'].count()).squeeze()
df['Weight 2'] = df['Name'].map(mapping).mask(df['Value'].isna())

  Name  Value  Weight 2
0    A    1.0  0.500000
1    A    2.0  0.500000
2    A    NaN       NaN
3    B    3.0  0.333333
4    B    7.0  0.333333
5    B    9.0  0.333333
6    B    NaN       NaN
Run Code Online (Sandbox Code Playgroud)