pandas如何按id匹配为对应国家列单元格标记X
你现在的循环实现逻辑没问题,但不符合pandas向量化运算的设计思路,用内置函数可以更简洁高效完成需求,同时可以简化你之前读取文件阶段的冗余代码。
优化后完整代码
首先简化文件读取合并的逻辑,不需要手动循环重置索引:
import pandas as pd import glob savepath = '/home/pedro/myPython/pandas/xl_files/' saveoutputpath = '/home/pedro/myPython/pandas/outputxl/' filelist = glob.glob(savepath + "*.xlsx") # 合并时传入ignore_index=True,自动生成连续唯一的行索引,省去手动赋值索引的步骤 df = pd.concat((pd.read_excel(f) for f in filelist), ignore_index=True)
核心转换部分只用少量代码就能完成标记,不需要转字典、逐行循环:
# 生成交叉表:行维度为id,列维度为国家,值代表当前id是否在对应国家的记录中存在 df_out = pd.crosstab(index=df["id"], columns=df["country"]).reset_index() # 将存在记录的位置(值>0)替换为X,无记录的位置保留0 country_columns = ["Canada", "Mexico", "USA"] df_out[country_columns] = df_out[country_columns].applymap(lambda val: "X" if val > 0 else 0) # 按id升序排序,重置索引保证顺序和你预期的一致 df_out = df_out.sort_values("id").reset_index(drop=True)
运行结果
用你提供的示例源数据运行,输出的df_out完全符合需求:
id Canada Mexico USA 0 15786 0 0 X 1 42345 X 0 X 2 76543 X 0 0 3 89153 0 X 0 4 93512 X X 0 5 331574 X X X 6 681593 0 X X
边界情况兼容
如果担心某个国家的Excel文件为空导致列缺失,可以加一段补全列的逻辑,保证输出结构固定:
# 补全可能缺失的国家列 for col in country_columns: if col not in df_out.columns: df_out[col] = 0 # 固定列顺序 df_out = df_out[["id", "Canada", "Mexico", "USA"]]
最后导出Excel直接调用df_out.to_excel(saveoutputpath + "mark_result.xlsx", index=False)即可。
内容的提问来源于stack exchange,提问作者Pedroski
相关产品推荐
相关产品推荐

