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)
任何帮助表示赞赏。
您可以用来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)