Pandas Dataframe:遍历列并按条件修改对应行的另一列值
解决Pandas遍历列时仅修改对应行值的问题
你的代码问题出在每次赋值都直接给整个cycleNumber列赋值,而不是定位到当前循环的行。要实现只修改对应行的需求,有两种可行方案:
方案一:修改原循环,通过索引定位行
利用enumerate同时获取行索引和Ns列的值,然后用df.loc[行索引, 列名]精准修改指定行的cycleNumber值:
cycleNum = 0 first = 0 for idx, entry in enumerate(df1['Ns']): if entry < first: cycleNum += 1 df1.loc[idx, 'cycleNumber'] = cycleNum first = 0 else: df1.loc[idx, 'cycleNumber'] = cycleNum first = entry
这里enumerate(df1['Ns'])会返回每个元素的位置索引idx和对应值entry,df1.loc[idx, 'cycleNumber']能直接定位到当前行的目标列,只修改这一行的值,不会影响整列其他数据。
方案二:用Pandas矢量化操作优化(更高效)
如果你的DataFrame数据量较大,循环遍历的效率会偏低,推荐先计算好所有行的cycleNum值,再一次性赋值给列:
cycleNum = 0 first = 0 cycle_numbers = [] for entry in df1['Ns']: if entry < first: cycleNum += 1 first = 0 else: first = entry cycle_numbers.append(cycleNum) # 一次性赋值整列,避免循环内逐行修改的开销 df1['cycleNumber'] = cycle_numbers
这种方式先在列表中完成所有行的cycleNum计算,最后统一赋值给列,在大数据集下的运行效率会比逐行修改高很多。
如果你的DataFrame使用了非连续的自定义行索引,方案一中的idx是默认的位置索引,此时可以改用df1.iloc[idx, df1.columns.get_loc('cycleNumber')]来定位目标单元格。
内容的提问来源于stack exchange,提问作者Luke Delves
相关产品推荐
相关产品推荐

