Python字符串拼接:补全CSV文件中的缺失城市名
解决方案:基于有效城市库的缺失城市名修复
这个需求我之前帮朋友处理过,你的思路特别务实——用有效城市名单做校验基准,避免瞎拼接出无效名称,完全是正确的方向!下面给你一套完整的Python实现方案:
核心逻辑对齐你的思路
- 先加载独立的有效城市名单,作为“正确答案库”
- 从目标CSV的信息列末尾提取1-2个字母作为候选前缀
- 把前缀和缺首字母的城市名拼接,去匹配“正确答案库”
- 只有匹配成功的,才保留拼接结果;匹配失败就留原数据,方便后续处理
具体步骤&代码
1. 先准备好两个CSV文件
- 待修复文件:比如叫
broken_cities.csv,包含两列:partial_city(缺首字母的城市,比如w York)、info_with_prefix(末尾带缺失前缀的信息,比如word word Ne) - 有效城市库:比如叫
valid_cities.csv,至少有一列full_city,存着所有正确的完整城市名(比如New York、London)
2. Python代码实现
import pandas as pd # 第一步:加载有效城市名单,转成集合(集合的匹配速度比列表快N倍) valid_cities = set(pd.read_csv('valid_cities.csv')['full_city'].str.strip()) # 第二步:读取需要修复的原始数据 df = pd.read_csv('broken_cities.csv') # 第三步:写一个修复函数,核心是「提取前缀→拼接→验证」 def repair_city(row): # 先把两个列的内容都去个空格,避免多余空格搞砸匹配 partial_city = row['partial_city'].strip() info_text = row['info_with_prefix'].strip() # 先试提取末尾2个字符(因为你示例里是缺2个字母),再试1个 for prefix_length in [2, 1]: # 确保信息列长度够提取前缀,避免报错 if len(info_text) >= prefix_length: candidate_prefix = info_text[-prefix_length:] # 拼接成完整城市名候选 candidate_full_city = f"{candidate_prefix}{partial_city}" # 验证是否在有效城市库里 if candidate_full_city in valid_cities: return candidate_full_city # 如果两种长度的前缀都匹配失败,返回原不完整城市名(或者你可以改成返回NaN) return partial_city # 第四步:把修复函数应用到每一行,生成新的修复后列 df['fixed_city'] = df.apply(repair_city, axis=1) # 第五步:保存修复后的结果 df.to_csv('fixed_cities.csv', index=False)
3. 关键细节解释
- 用集合存有效城市:集合的
in操作是O(1)时间复杂度,数据量大的时候比用列表快太多,效率拉满 - 优先试2个字符前缀:因为你的示例是缺2个字母,先试长前缀能减少误匹配(比如避免把
w York拼成Ew York这种无效名) - 去空格处理:实际工作里CSV经常会有多余空格,
strip()能避免因为空格导致匹配失败 - 容错处理:如果拼接后不在有效库,返回原数据,不会把错误结果塞进去,方便你后续人工排查那些匹配失败的行
4. 实际测试示例
假设你的原始数据是:
| partial_city | info_with_prefix |
|---|---|
| w York | word word Ne |
| ondon | meeting notes L |
| aris | report draft Pa |
有效城市库有New York、London、Paris,运行代码后,fixed_city列会得到:New York、London、Paris,完全符合预期!
内容的提问来源于stack exchange,提问作者studious1905
相关产品推荐
相关产品推荐

