Python中如何访问Pandas itertuples生成的无名称元组的索引字段
问题原因
你报错的核心原因是:你打印的_1、_3是itertuples()方法返回的命名元组对象的属性名,不是DataFrame本身的列名。
你删除第一列后,dfstart、dfstop的列名是默认整数1、2、3、4、5,所以直接用_1、'_1'索引DataFrame自然会报错。
行数据访问方法
1. 遍历场景(用itertuples)
直接通过命名元组的属性访问即可:
for row in dfstart.itertuples(): # 分别获取第1、3、5列的值 val1 = row._1 val3 = row._3 val5 = row._5 # 可自行加业务逻辑 print(val1, val3, val5)
2. 批量操作场景(直接索引DataFrame)
不需要遍历,直接用整数列名索引即可:
- 单列访问:
dfstart[1] - 多列访问:
dfstart[[1,3,5]]
最终需求实现方案
不需要自己遍历行判断,用pandas内置方法即可高效实现,推荐用merge内连接方案,代码最简洁:
# 提取dfstop用于匹配的两列,先去重避免重复匹配 stop_match_cols = dfstop[[1,3]].drop_duplicates() # 两列同时匹配取交集,再提取需要的三个列 result_df = dfstart.merge(stop_match_cols, on=[1,3], how="inner")[[1,3,5]] # 可选:给结果列重命名,可读性更高 result_df.columns = ["user_id", "biz_code", "country"]
如果你更习惯用isin逻辑,可以用集合匹配的方式:
# 把dfstop的匹配对转成集合,查询效率更高 match_pairs = set(zip(dfstop[1], dfstop[3])) # 生成过滤掩码 filter_mask = dfstart.apply(lambda x: (x[1], x[3]) in match_pairs, axis=1) # 提取符合条件的行和列 result_df = dfstart.loc[filter_mask, [1,3,5]]
运行上述代码后,result_df就是你需要的新DataFrame。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

