如何使用循环和条件语句遍历两个DataFrame生成新DataFrame
基于循环实现Pandas DataFrame指定操作实现方案
示例数据构造
先给出可直接运行的测试数据构造代码,方便验证逻辑:
import pandas as pd # 构造示例df df = pd.DataFrame({ 'g_pairs': ['p1', 'p2', 'p3', 'p4'], 'g_a': ['id1', 'id2', 'id3', 'id4'], 'g_b': ['id2', 'id3', 'id4', 'id1'], 'clust1': [0.02, 0.06, 0.03, 0.07], 'clust2': [0.1, 0.2, 0.3, 0.4] # 多余集群列,后续会删除 }) # 构造示例df2 df2 = pd.DataFrame({ 'clust_1n': ['id1', 'id2', 'id3', 'id4'], 'clust_1l': [10, 20, 30, 40], 'clust_2n': ['id1', 'id2', 'id3', 'id4'], 'clust_2l': [100, 200, 300, 400] # 多余集群列,后续会删除 })
分步实现(全循环逻辑)
注意:iterrows() 是Pandas中最常用的行循环遍历方法,返回的行是原数据的副本,直接修改row值不会生效,需要通过loc索引定位到原DataFrame的对应位置修改
- 步骤1:筛选保留指定集群相关列
target_clust = 'clust1' # 筛选df保留指定列 df = df[['g_pairs', 'g_a', 'g_b', target_clust]].copy() # 筛选df2保留对应集群的n、l列,重命名简化后续处理 df2 = df2[[f'{target_clust}_n', f'{target_clust}_l']].copy() df2.columns = ['n', 'l']
- 步骤2、3:循环匹配ID,新增g_a_val、g_b_val列
# 先初始化两列为空值 df['g_a_val'] = None df['g_b_val'] = None # 外层循环遍历df的每一行 for df_idx, df_row in df.iterrows(): # 内层循环遍历df2的每一行匹配ID for df2_idx, df2_row in df2.iterrows(): # 匹配g_a if df_row['g_a'] == df2_row['n']: df.loc[df_idx, 'g_a_val'] = df2_row['l'] # 匹配g_b if df_row['g_b'] == df2_row['n']: df.loc[df_idx, 'g_b_val'] = df2_row['l']
- 步骤4:循环计算每行g_a_val和g_b_val的和,存入sums列
df['sums'] = None for idx, row in df.iterrows(): df.loc[idx, 'sums'] = row['g_a_val'] + row['g_b_val']
- 步骤5:循环判断clust1值,替换符合条件的sums为0
for idx, row in df.iterrows(): if row[target_clust] >= 0.051: df.loc[idx, 'sums'] = 0
最终输出示例
g_pairs g_a g_b clust1 g_a_val g_b_val sums 0 p1 id1 id2 0.02 10 20 30 1 p2 id2 id3 0.06 20 30 0 2 p3 id3 id4 0.03 30 40 70 3 p4 id4 id1 0.07 40 10 0
内容的提问来源于stack exchange,提问作者newbzzs
相关产品推荐
相关产品推荐

