如何使用Python处理DataFrame中的账号对应城市空值填充问题
用Pandas DataFrame填充同一账号的城市空值
核心思路
基于每个账号对应唯一有效城市的前提,先提取账号-城市的映射关系,再用该映射批量填充所有空值,确保同一账号的CityName字段统一。
步骤实现
1. 导入依赖并加载数据
实际场景中可通过pd.read_excel()/pd.read_csv()读取表格文件,以下用你提供的样例数据构造DataFrame:
import pandas as pd # 构造第一个表格的DataFrame df1 = pd.DataFrame({ "Acc numb": [123456]*5 + [910234]*3 + [910324]*4 + [360825]*5 + [123456]*5, "CityName": ["", "Delhi", "", "", "", "", "", "", "", "Bangalore", "", "", "", "", "", "Mumbai", "", "", "", "", "", ""] }) # 构造第二个表格的DataFrame df2 = pd.DataFrame({ "Acc numb": [123456]*5 + [910234]*3 + [910324]*4 + [360825]*5 + [123456]*5, "CityName": ["Delhi"]*5 + ["Bangalore"]*3 + ["Bangalore"]*4 + ["Mumbai"]*5 + ["", "", "", "", ""] })
2. 合并表格(可选,按需选择)
若需统一处理两个表格的数据,用pd.concat合并:
merged_df = pd.concat([df1, df2], ignore_index=True)
3. 生成账号-城市映射字典
提取每个账号对应的非空城市值,确保映射唯一:
# 过滤空值、去重,生成账号到城市的映射 city_mapping = merged_df.dropna(subset=["CityName"]) \ .drop_duplicates("Acc numb") \ .set_index("Acc numb")["CityName"] \ .to_dict() # 单表格处理时,直接替换为对应df即可,比如df1
4. 批量填充空值
用映射字典替换CityName字段的空值:
# 填充合并后的表格 merged_df["CityName"] = merged_df["CityName"].fillna(merged_df["Acc numb"].map(city_mapping)) # 分别填充原始表格 df1["CityName"] = df1["CityName"].fillna(df1["Acc numb"].map(city_mapping)) df2["CityName"] = df2["CityName"].fillna(df2["Acc numb"].map(city_mapping))
5. 验证结果
查看处理后的账号数据,确认空值已被填充:
print(merged_df[merged_df["Acc numb"] == 123456])
特殊场景处理
- 无有效城市的账号:若某账号无任何非空CityName,填充后仍为空,可追加
fillna("Unknown")设置默认值 - 同一账号多城市值:若账号对应多个不同城市,需先清洗数据,比如取第一个出现的非空值:
city_mapping = merged_df.dropna(subset=["CityName"]) \ .groupby("Acc numb") \ .first()["CityName"] \ .to_dict()
内容的提问来源于stack exchange,提问作者Pythonguy
相关产品推荐
相关产品推荐

