如何将Pandas数据框的区域城市列与RegionCity实例列表匹配?
Pandas匹配Region-City数据类实例的解决方法
原代码报错的核心原因:直接用df['Region']和df['City']这两个Series创建RegionCity对象,得到的是一个包含Series的RegionCity实例,而非逐行生成的单个实例,没法和region_city列表里的实例直接比较,从而触发了歧义错误。
下面是几种可行的解决方法:
方法一:用apply逐行生成实例匹配(保留数据类逻辑)
先把region_city转成集合(提升匹配效率,数据类默认可哈希),再用apply逐行生成RegionCity实例并判断是否在集合中:
from dataclasses import dataclass import pandas as pd @dataclass class RegionCity: region: str city: str # 注意修正实例创建方式(原代码append传两个参数会报错) region_city = [] region_city.append(RegionCity('New York', 'Hempstead town')) # 转成集合加速匹配 region_city_set = set(region_city) # 示例数据框 df = pd.DataFrame({ 'Region': ['New York', 'New York', 'California'], 'City': ['New York City', 'Hempstead town', 'Los Angeles'], 'Population': ['8,335,897', '393,375', '3,898,747'] }) # 筛选匹配行 filtered_df = df[df.apply(lambda row: RegionCity(row['Region'], row['City']) in region_city_set, axis=1)] print(filtered_df)
方法二:转元组集合匹配(性能最优)
跳过数据类实例创建,直接把region_city转成(region, city)元组的集合,匹配数据框行的元组:
# 生成元组集合 region_city_tuples = set((rc.region, rc.city) for rc in region_city) # 直接匹配列组合的元组 filtered_df = df[df[['Region', 'City']].apply(tuple, axis=1).isin(region_city_tuples)] print(filtered_df)
方法三:用merge内连接(适合大数据量)
把region_city转成小数据框,通过内连接筛选匹配行,Pandas的merge对大数据量优化更好:
# 转成匹配用的小数据框 rc_df = pd.DataFrame([(rc.region, rc.city) for rc in region_city], columns=['Region', 'City']) # 内连接得到匹配行 filtered_df = pd.merge(df, rc_df, on=['Region', 'City'], how='inner') print(filtered_df)
各方法适用场景
- 方法一:需要保留
RegionCity数据类的业务逻辑时使用,性能略逊于后两种 - 方法二:纯列匹配场景下性能最优,代码简洁
- 方法三:数据量较大时优先选择,利用Pandas向量化操作提升效率
内容的提问来源于stack exchange,提问作者Jas
相关产品推荐
相关产品推荐

