You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:12:39