如何在Pandas中遍历DataFrame列表并引用前序计算结果?
解决方案
核心问题是你没保存前序处理后的结果,也没在后续循环中关联前序的r_results值。下面是修改后的完整代码,适配多DataFrame的顺序处理:
import pandas as pd # 示例数据 df1 = pd.DataFrame({'ID':[1,2,3], 'r_f':[0.18878187,0.327355797,0.100753051]}) df2 = pd.DataFrame({'ID':[1,2,3,4,5], 'r_f':[0.300009355,0.331788473,0.146077926,0.167329833,0.245227094]}) df_lst = [df1, df2] thd_new = 0.3 thd_curr = 0.3333 def buffer_screen(curr, r): if curr == 1 and r <= thd_curr: return 1 elif curr == 0 and r <= thd_new: return 1 else: return 0 # 存储处理后的DataFrame列表 processed_dfs = [] # 处理第一个DataFrame first_df = df_lst[0].copy() first_df['r_results'] = first_df['r_f'].apply(lambda x: 1 if x <= thd_new else 0) processed_dfs.append(first_df) # 处理后续的DataFrame for idx in range(1, len(df_lst)): curr_df = df_lst[idx].copy() # 获取前一个处理好的DataFrame prev_processed = processed_dfs[idx-1] # 按ID合并,获取前一个的r_results,新ID默认curr为0 merged = curr_df.merge(prev_processed[['ID', 'r_results']], on='ID', how='left').fillna({'r_results': 0}) # 计算当前的r_results merged['r_results'] = merged.apply(lambda row: buffer_screen(row['r_results'], row['r_f']), axis=1) # 保留当前df的原列+新计算的r_results processed_curr = merged[curr_df.columns.tolist() + ['r_results']] processed_dfs.append(processed_curr) # 查看结果 for i, df in enumerate(processed_dfs): print(f"处理后的第{i+1}个DataFrame:") print(df) print("-"*30)
关键说明:
- 用
processed_dfs列表保存每一步处理后的结果,确保后续循环能直接获取前序的r_results - 处理后续df时,通过
merge按ID关联前序结果,新出现的ID(比如df2里的4、5)因为没有前序记录,填充r_results=0,按新阈值规则处理 - 每次处理都用
copy()避免修改原DataFrame,防止数据污染
内容的提问来源于stack exchange,提问作者Silvia
相关产品推荐
相关产品推荐

