You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:53:22