使用Pandas在Python每次For循环迭代后新增tau列的代码修正需求
问题解决:为DataFrame批量生成tau列
原始数据
y proba 1 1 12 2 1 65 3 1 1 4 1 54
问题代码
尝试通过循环为DataFrame新增tau{i}列,判断每行proba是否大于等于对应索引行的proba值并转换为1/0:
for i in range(len(df1["proba"])): a=pd.concat([df1, pd.Series(df1["proba"] >= df1["proba"][i], name=f'tau{i}').astype(int)], axis=1) print(a)
期望输出
y proba tau1 tau2 tau3 tau4 1 1 12 1 0 1 0 2 1 65 1 1 1 1 3 1 1 0 0 1 0 4 1 54 1 0 1 1
问题分析
- 循环中每次都用原始df1和新列拼接,无法累积之前生成的tau列,导致每次输出仅包含当前循环的tau列,最终得不到完整结果。
- 使用
range(len(df1["proba"]))得到的是0-3的索引,生成的列名是tau0-tau3,和期望的tau1-tau4不匹配。
解决方案
方法1:循环累积添加列(直观易懂)
基于原始DataFrame复制一份结果集,遍历DataFrame的实际索引逐个添加tau列:
import pandas as pd # 构造/读取你的数据 data = {'y': [1,1,1,1], 'proba': [12,65,1,54]} df1 = pd.DataFrame(data, index=[1,2,3,4]) # 初始化结果DataFrame result = df1.copy() # 遍历每个索引,生成对应的tau列 for idx in df1.index: result[f'tau{idx}'] = (df1['proba'] >= df1['proba'].loc[idx]).astype(int) print(result)
方法2:向量化操作(高效,适合大数据集)
利用numpy广播特性一次性生成所有tau列,再和原始DataFrame拼接,避免循环开销:
import pandas as pd import numpy as np # 构造/读取你的数据 data = {'y': [1,1,1,1], 'proba': [12,65,1,54]} df1 = pd.DataFrame(data, index=[1,2,3,4]) # 生成所有tau列的数值矩阵 tau_values = (df1['proba'].values >= df1['proba'].values[:, np.newaxis]).astype(int) # 转换为DataFrame并设置列名、索引 tau_df = pd.DataFrame( tau_values, columns=[f'tau{idx}' for idx in df1.index], index=df1.index ) # 和原始数据拼接 result = pd.concat([df1, tau_df], axis=1) print(result)
两种方法都能输出符合期望的结果,方法2在数据量大时性能更优。
内容的提问来源于stack exchange,提问作者buzz bowlekar
相关产品推荐
相关产品推荐

