Pandas按经纬度分组获取street_type最高频值及对应计数
问题原因排查
你统计结果异常的核心原因是示例代码中构造street_type字段时错误使用了集合{}定义,Python集合会自动去重,导致原本2条rectilinear记录仅保留1条,最终统计计数错误。
独热编码方案合理性说明
你使用get_dummies转独热编码再分组求和的思路是可行的,但不是最优方案:不需要额外做编码转换,直接通过自定义聚合函数就能一步拿到你需要的最高频类型、对应计数和坐标信息,代码更简洁易维护。
正确实现代码
步骤1:修正数据构造逻辑
import pandas as pd # street_type用列表[]定义,避免集合去重 data = { 'Latitude': [-41.794,-41.733,-41.335,-41.794], 'Longitude': [-12.344,-12.456,-12.929,-12.344], 'street_type': ['rectilinear','roundabout','intersection','rectilinear'] } df = pd.DataFrame(data)
方案1:沿用独热编码思路修正后实现
# 生成独热编码 df_dummy = pd.get_dummies(df, columns=['street_type']) # 分组求和 df_grouped = df_dummy.groupby(['Latitude','Longitude'], as_index=False).sum() # 取每行最大值对应的列名和数值即为最高频类型和计数
方案2:更简洁的自定义聚合实现(推荐)
不需要额外做编码转换,直接分组统计即可得到目标结果:
def calc_top_type(group): type_count = group.value_counts() # 取最高频类型和对应计数 return pd.Series([type_count.index[0], type_count.iloc[0]], index=['top_street_type', 'appear_count']) result = df.groupby(['Latitude','Longitude'], as_index=False)['street_type'].apply(calc_top_type)
输出结果示例
| Latitude | Longitude | top_street_type | appear_count |
|---|---|---|---|
| -41.794 | -12.344 | rectilinear | 2 |
| -41.733 | -12.456 | roundabout | 1 |
| -41.335 | -12.929 | intersection | 1 |
特殊情况处理
如果分组内存在多个频次相同的最高频类型,可以自行调整calc_top_type函数逻辑,比如返回所有并列类型,或者按自定义规则取优先级更高的类型即可。
内容的提问来源于stack exchange,提问作者Okenite
相关产品推荐
相关产品推荐

