您需要 GroupBy.transform 来填充由与原始 DataFrame 大小相同的聚合值填充的系列:
df['Risk Weighted'] = df.groupby('hs92_product_id')['Dummy_Weight'].transform('mean')
print (df)
hs92_product_id Dummy_Weight Risk Weighted
2578 854470 0.00 0.000000
2579 854470 0.00 0.000000
2580 854470 0.00 0.000000
2581 111111 0.50 0.150000
2582 111111 0.10 0.150000
2583 111111 0.00 0.150000
2584 111111 0.00 0.150000
2585 222222 0.25 0.166667
2586 222222 0.25 0.166667
2587 222222 0.00 0.166667
它返回一列缺失值,为什么?
如果检查groupby + mean 的输出得到:
print (df.groupby('hs92_product_id')['Dummy_Weight'].mean())
hs92_product_id
111111 0.150000
222222 0.166667
854470 0.000000
Name: Dummy_Weight, dtype: float64
这里index 是由hs92_product_id 和mean 的唯一值创建的。分配给新列后,熊猫尝试对齐索引,如果不匹配,则填充缺失值。
在更改的数据样本中验证:
print (df)
hs92_product_id Dummy_Weight
2578 854470 0.00
111111 854470 0.00 <- changed index value
2580 854470 0.00
2581 111111 0.50
2582 111111 0.10
2583 111111 0.00
2584 111111 0.00
2585 222222 0.25
2586 222222 0.25
2587 222222 0.00
print (df.groupby('hs92_product_id')['Dummy_Weight'].mean())
111111 0.150000 <- same index value exist in original df
222222 0.166667
854470 0.000000
Name: Dummy_Weight, dtype: float64
df['Risk Weighted'] = df.groupby('hs92_product_id')['Dummy_Weight'].mean()
print (df)
hs92_product_id Dummy_Weight Risk Weighted
2578 854470 0.00 NaN
111111 854470 0.00 0.15 <- data if indexes are aligned
2580 854470 0.00 NaN
2581 111111 0.50 NaN
2582 111111 0.10 NaN
2583 111111 0.00 NaN
2584 111111 0.00 NaN
2585 222222 0.25 NaN
2586 222222 0.25 NaN
2587 222222 0.00 NaN