如何用Pandas将ID140/141对应值分别填充至col_final_X/Y列?
Pandas按ID匹配填充目标列的实现方案
针对你需要将每行中ID140对应的值填入col_final_X、ID141对应的值填入col_final_Y的需求,以下提供两种实用的Pandas实现方法:
方法1:数据重塑法(适合列数较多的场景)
先将分散的多组col_n_ID和col_n_VAL列转换为规整的键值对格式,再匹配目标ID填充到对应列:
import pandas as pd import numpy as np # 构造示例DataFrame(实际使用时替换为pd.read_csv("你的文件路径.csv")) df = pd.DataFrame({ 'ID': [1,2,3], 'Name': ['James','John','Mike'], 'col_1_ID': [56,140,141], 'col_1_VAL': ['Back',40,77.4], 'col_2_ID': [140,np.nan,140], 'col_2_VAL': [56.8,np.nan,40], 'col_3_ID': [141,140,np.nan], 'col_3_VAL': [44.9,90.1,np.nan], 'col_final_X': ['','',''], 'col_final_Y': ['','',''] }) # 提取所有ID列和对应的VAL列 id_cols = [col for col in df.columns if '_ID' in col] val_cols = [col.replace('_ID', '_VAL') for col in id_cols] # 转换为长格式的键值对表 melted_data = pd.DataFrame({ '原行ID': df['ID'].repeat(len(id_cols)), '目标ID': pd.concat([df[col] for col in id_cols]).reset_index(drop=True), '对应值': pd.concat([df[col] for col in val_cols]).reset_index(drop=True) }).dropna(subset=['目标ID']) # 按原行ID分组,提取140和141的对应值(这里取第一个匹配值,可按需调整) x_values = melted_data[melted_data['目标ID'] == 140].groupby('原行ID')['对应值'].first() y_values = melted_data[melted_data['目标ID'] == 141].groupby('原行ID')['对应值'].first() # 填充到原DataFrame的目标列 df['col_final_X'] = df['ID'].map(x_values) df['col_final_Y'] = df['ID'].map(y_values) print(df)
说明:如果一行存在多个ID140的值(比如John的行),可将first()替换为:
', '.join(map(str, ...)):将所有值用逗号拼接成字符串sum():对数值类型的值求和
方法2:逐行匹配法(直观易懂,适合列数较少的场景)
逐行构建ID与值的映射字典,直接提取目标ID对应的值填充:
import pandas as pd import numpy as np # 构造示例DataFrame(实际使用时替换为pd.read_csv("你的文件路径.csv")) df = pd.DataFrame({ 'ID': [1,2,3], 'Name': ['James','John','Mike'], 'col_1_ID': [56,140,141], 'col_1_VAL': ['Back',40,77.4], 'col_2_ID': [140,np.nan,140], 'col_2_VAL': [56.8,np.nan,40], 'col_3_ID': [141,140,np.nan], 'col_3_VAL': [44.9,90.1,np.nan], 'col_final_X': ['','',''], 'col_final_Y': ['','',''] }) def fill_target_columns(row): # 构建当前行的ID-值映射 id_val_dict = {} # 遍历所有ID-VAL列对(这里假设是col_1到col_3,可根据实际列数调整) for i in range(1, 4): id_col = f'col_{i}_ID' val_col = f'col_{i}_VAL' if pd.notna(row[id_col]): id_val_dict[row[id_col]] = row[val_col] # 填充目标列,无匹配值则设为NaN row['col_final_X'] = id_val_dict.get(140, np.nan) row['col_final_Y'] = id_val_dict.get(141, np.nan) # 若需处理多个匹配值,例如拼接所有140对应值: # row['col_final_X'] = ', '.join([str(v) for k, v in id_val_dict.items() if k == 140]) if 140 in id_val_dict else np.nan return row # 应用函数到每行 df = df.apply(fill_target_columns, axis=1) print(df)
说明:注释中提供了处理多个匹配值的代码示例,可根据实际需求启用。
内容的提问来源于stack exchange,提问作者WilliamAshoti
相关产品推荐
相关产品推荐

