Pandas DataFrame循环添加新列:按住宅组与小区域分配建造年份中位数
解决方法:为每个建筑匹配所属小区域+住宅组的建造年份中位数
嘿,我完全明白你的需求——你希望给每个建筑分配它所在小区域+对应住宅组的建造年份中位数,而且不想手动写繁琐的for循环对吧?其实用Pandas的groupby结合transform就能高效搞定,比循环简洁得多!
核心思路
我们需要同时按「小区域编码(cso_small_area)」和「住宅组(Dwelling Group)」分组,计算每组的建造年份中位数,然后把这个中位数映射回组内的每一行,新增一列存储结果。
完整代码示例
1. 处理所有住宅组(包含Apartment/ Semi detached house等)
如果你想给所有类型的住宅都匹配对应组的中位数,直接运行这段代码:
# 新增列存储中位数:按小区域+住宅组分组后计算中位数,广播到每一行 geo_dwelling['Year_construction_median'] = geo_dwelling.groupby(['cso_small_area', 'Dwelling Group'])['Year of construction'].transform('median')
2. 仅处理Apartment类(匹配你已有的筛选逻辑)
如果你只需要处理Apartment类型的建筑,可以保留你已有的筛选代码,再添加中位数计算:
# 你已有的筛选代码:只保留Apartment类 geo_dwelling = geo_dropped[geo_dropped["Dwelling Group"].str.contains("Apartment", na=False)] # 新增列:按小区域分组计算Apartment的建造年份中位数 geo_dwelling['Apartment_Year_median'] = geo_dwelling.groupby('cso_small_area')['Year of construction'].transform('median')
代码解释
groupby(['cso_small_area', 'Dwelling Group']):把数据拆分成「某个小区域里的某类住宅」的分组,比如“小区域7101的所有Apartment”就是一个独立组.transform('median'):计算每个组的中位数,然后自动把这个值赋值给组内的每一行,不用手动循环拆分再合并,完美解决你的需求!
验证结果
你可以通过以下代码查看某个小区域的结果,确认中位数是否正确赋值:
# 查看小区域7101的Apartment数据,验证中位数列 print(geo_dwelling[geo_dwelling['cso_small_area'] == 7101][['cso_small_area', 'Dwelling Group', 'Year of construction', 'Apartment_Year_median']].head())
为什么不用for循环?
Pandas的向量化操作(groupby+transform)比手动写for循环效率高得多,尤其是数据量较大时,而且代码更简洁易读,维护起来也更方便。
内容的提问来源于stack exchange,提问作者oisindoherty3
相关产品推荐
相关产品推荐

