Python DataFrame行操作:无需循环按地点分组聚合技术与频率的高效方法
实现方案
你可以直接使用 pandas 内置的分组聚合与透视功能实现需求,所有操作均为向量化执行,无 Python 层遍历,效率远高于手动循环:
- 先做数据预处理,把 Frequency 转为字符串类型方便拼接:
import pandas as pd # 将频率列转为字符串,避免拼接时类型报错 df['Frequency'] = df['Frequency'].astype(str)
- 按 Location Code 分组聚合公共字段,同时合并所有技术类型:
# 公共字段(纬度、经度等同一个位置编码对应值一致)直接取第一条即可 base_info = df.groupby('Location Code').agg( Technologies=('Technology', lambda x: ','.join(sorted(x.unique()))), Latitude=('Latitude', 'first'), Longitude=('Longitude', 'first') # 其余公共字段均可按此格式补充,取值统一用first ).reset_index()
- 透视生成不同技术对应的频率列:
# 按位置+技术分组拼接频率,再转为宽表 freq_df = df.groupby(['Location Code', 'Technology'])['Frequency']\ .agg(lambda x: ','.join(sorted(x, key=int)))\ .unstack(fill_value='n/a')\ .reset_index() # 重命名列名匹配你的需求 freq_df.columns = [col if col == 'Location Code' else f"{col}'s" for col in freq_df.columns]
- 合并两张表得到最终结果:
result = pd.merge(base_info, freq_df, on='Location Code', how='left')
如果需要调整频率的排序规则,修改agg中sorted的参数即可。
内容的提问来源于stack exchange,提问作者tareenmj
相关产品推荐
相关产品推荐

