PySpark DataFrame条件过滤与分层比例插补需求
PySpark DataFrame 零值插补需求
现有DataFrame结构与数据
给定PySpark DataFrame df,结构及数据如下:
| ID | Total_Count | A | B | C | D | Group | Name | Chain |
|---|---|---|---|---|---|---|---|---|
| 1 | 56 | 0 | 0 | 0 | 0 | 1 | Apple | Fruits1 |
| 2 | 65 | 0 | 0 | 0 | 0 | 1 | Apple | Fruits1 |
| 3 | 72 | 0 | 0 | 30 | 0 | 1 | Banana | Fruits1 |
| 4 | 80 | 0 | 0 | 0 | 0 | 1 | Strawberry | Fruits1 |
| 5 | 142 | 58 | 58 | 14 | 12 | 1 | Apple | Fruits1 |
| 6 | 130 | 63 | 50 | 9 | 8 | 1 | Apple | Fruits1 |
| 7 | 145 | 74 | 44 | 17 | 10 | 1 | Apple | Fruits1 |
| 8 | 119 | 54 | 48 | 8 | 9 | 1 | Apple | Fruits1 |
| 11 | 161 | 71 | 63 | 16 | 11 | 1 | Banana | Fruits1 |
| 12 | 124 | 54 | 43 | 19 | 8 | 1 | Banana | Fruits1 |
插补逻辑
需要对A、B、C、D列中存在零值的行(ID为1、2、3、4的行)进行插补,规则如下:
- 优先采用Group×Name层级的比例平均值(该层级有非零数据时),其次采用Group×Chain层级的比例平均值,最后采用Group层级的比例平均值。
- 以插补ID1、2为例:筛选Group=1且Name=Apple的非零行,计算每行的比例
A/Total_Count、B/Total_Count、C/Total_Count、D/Total_Count,得到比例表:A_PROP B_PROP C_PROP D_PROP 0.408451 0.408450704 0.098592 0.084507042 0.484615 0.384615385 0.069231 0.061538462 0.510345 0.303448276 0.117241 0.068965517 0.453782 0.403361345 0.067227 0.075630252
- 以插补ID1、2为例:筛选Group=1且Name=Apple的非零行,计算每行的比例
- 取上述比例的平均值,将平均值乘以当前行的
Total_Count,得到插补后的A、B、C、D值(结果取整)。
预期输出DataFrame df2
| ID | Total_Count | A_prop_avg | B_prop_avg | C_prop_avg | D_prop_avg | A | B | C | D |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 56 | 0.46429811 | 0.37496893 | 0.08807265 | 0.07266032 | 26 | 21 | 5 | 4 |
| 2 | 65 | 0.464298107 | 0.374968927 | 0.088072647 | 0.072660318 | 30 | 24 | 6 | 5 |
| 3 | 72 | 0.43823883 | 0.369039271 | 0.126302344 | 0.066419555 | 32 | 27 | 9 | 5 |
| 4 | 80 | 0.455611681 | 0.372992375 | 0.10081588 | 0.070580064 | 36 | 30 | 8 | 6 |
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

