使用Python与Pandas实现特定规则的分组平均值计算
Pandas 按规则生成新增列newcol
原始数据
原始DataFrame结构如下:
Lat Lon Year Area Value group_a group_b -31.3484 -60.0629 2019 70 24 a ia -26.8443 -64.5456 2020 492 12 a ia -27.6536 -62.2072 2017 173 111 b md -26.4552 -61.4804 2020 255 76 b ct -35.6044 -63.5238 2019 204 12 a de -35.6044 -63.5238 2021 124 26 c ca
需求说明
- 找出
Lat和Lon值均重复的行,为这些行的newcol列赋值为对应坐标组Value的平均值(示例中最后两行的newcol为19); - 其余行的
newcol按group_a+group_b的组合计算Value的平均值(示例中group_a=a且group_b=ia的行newcol为18)。
实现代码
import pandas as pd # 构建原始DataFrame data = { 'Lat': [-31.3484, -26.8443, -27.6536, -26.4552, -35.6044, -35.6044], 'Lon': [-60.0629, -64.5456, -62.2072, -61.4804, -63.5238, -63.5238], 'Year': [2019, 2020, 2017, 2020, 2019, 2021], 'Area': [70, 492, 173, 255, 204, 124], 'Value': [24, 12, 111, 76, 12, 26], 'group_a': ['a', 'a', 'b', 'b', 'a', 'c'], 'group_b': ['ia', 'ia', 'md', 'ct', 'de', 'ca'] } df = pd.DataFrame(data) # 计算两类分组的Value平均值 lat_lon_mean = df.groupby(['Lat', 'Lon'])['Value'].transform('mean') group_mean = df.groupby(['group_a', 'group_b'])['Value'].transform('mean') # 先给newcol赋值为分组平均值,再替换坐标重复行的值 df['newcol'] = group_mean lat_lon_dup_rows = df.duplicated(['Lat', 'Lon'], keep=False) df.loc[lat_lon_dup_rows, 'newcol'] = lat_lon_mean[lat_lon_dup_rows] # 打印结果 print(df.to_string(index=False))
运行结果
运行代码后得到的最终结果如下:
Lat Lon Year Area Value group_a group_b newcol -31.3484 -60.0629 2019 70 24 a ia 18 -26.8443 -64.5456 2020 492 12 a ia 18 -27.6536 -62.2072 2017 173 111 b md 111 -26.4552 -61.4804 2020 255 76 b ct 76 -35.6044 -63.5238 2019 204 12 a de 19 -35.6044 -63.5238 2021 124 26 c ca 19
内容的提问来源于stack exchange,提问作者user308827
相关产品推荐
相关产品推荐

