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

如何在Pandas中基于匹配行值创建新列intensity_value?

解决方案

以下是几种在Pandas中实现需求的实用方法:

方法1:用pivot重塑数据(最简洁高效)

这种方法通过将test_name的不同取值转为列,直接实现同组数据的匹配:

import pandas as pd

# 构建示例DataFrame
df = {'trial_id': {73: 79, 300: 79, 515: 79, 715: 79, 2541: 79, 2673: 79, 2810: 79, 2960: 79}, 
      'tp': {73: 'w1s1', 300: 'w2s1', 515: 'w3s1', 715: 'w4s1', 2541: 'w1s1', 2673: 'w2s1', 2810: 'w3s1', 2960: 'w4s1'}, 
      'test_name': {73: 'PANAS', 300: 'PANAS', 515: 'PANAS', 715: 'PANAS', 2541: 'intensity', 2673: 'intensity', 2810: 'intensity', 2960: 'intensity'}, 
      'value': {73: 25.0, 300: 30.0, 515: 35.0, 715: 34.0, 2541: 0.0, 2673: 0.0, 2810: 50.0, 2960: 0.0}} 
df = pd.DataFrame.from_dict(df)

# 按trial_id和tp分组,将test_name转为列
pivoted_df = df.pivot(index=['trial_id', 'tp'], columns='test_name', values='value').reset_index()
# 重命名列并整理结构
result = pivoted_df.rename(columns={'PANAS': 'value', 'intensity': 'intensity_value'})
result = result[['trial_id', 'tp', 'value', 'intensity_value']]

print(result)

输出结果中,tp='w3s1'的行intensity_value会正确显示为50,完全匹配需求。

方法2:用merge合并子集数据

如果需要保留原DataFrame的完整结构,仅给test_name='PANAS'的行添加新列,可采用合并方式:

import pandas as pd

df = {...} # 同示例DataFrame定义
df = pd.DataFrame.from_dict(df)

# 提取intensity分组的数据,重命名列以便合并
intensity_subset = df[df['test_name'] == 'intensity'][['trial_id', 'tp', 'value']].rename(columns={'value': 'intensity_value'})

# 仅对PANAS行进行合并,得到目标结果
panas_result = df[df['test_name'] == 'PANAS'].merge(intensity_subset, on=['trial_id', 'tp'], how='left')

# 若要给原DataFrame所有行添加列(非PANAS行设为None),执行以下代码:
df['intensity_value'] = df.apply(
    lambda row: intensity_subset[(intensity_subset['trial_id'] == row['trial_id']) & (intensity_subset['tp'] == row['tp'])]['intensity_value'].iloc[0]
    if row['test_name'] == 'PANAS' else None,
    axis=1
)

print(df)

方法3:用groupby+自定义函数处理分组

通过分组后逐组提取对应值,适合需要更灵活逻辑的场景:

import pandas as pd

df = {...} # 同示例DataFrame定义
df = pd.DataFrame.from_dict(df)

def add_intensity_col(group):
    # 从当前分组中获取intensity的value
    intensity_val = group[group['test_name'] == 'intensity']['value'].iloc[0]
    # 仅给PANAS行赋值,其他行设为None
    group['intensity_value'] = group.apply(lambda x: intensity_val if x['test_name'] == 'PANAS' else None, axis=1)
    return group

# 按trial_id和tp分组处理
df = df.groupby(['trial_id', 'tp']).apply(add_intensity_col).reset_index(drop=True)

print(df)

方法选择建议

  • 若数据结构规整(每个trial_id+tp对应唯一的PANAS和intensity行),优先选方法1,代码简洁且性能最优;
  • 若存在部分分组缺失数据的情况,方法2的merge能自动用NaN填充缺失值,兼容性更强;
  • 方法3适合需要扩展复杂逻辑的场景,灵活性最高。

内容的提问来源于stack exchange,提问作者tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:50:43