You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:21:22