如何使用Pandas添加基于同press下新旧cond的ratios计算列?
问题描述
给定如下数据集:
ID cond press metrics 0 h1 new 30 1.2 1 h2 old 30 1.0 2 h3 new 50 1.5 3 h4 old 50 1.4 4 h5 new 70 1.8
需要给数据集添加一列名为ratios的列,规则如下:
- 仅当
cond为new,且同一press分组下存在cond为old的记录时,ratios的值为old的metrics值/new的metrics值的字符串形式(如1.0/1.2) - 其余情况(
cond为old,或同一press下无对应old记录的new行),ratios填充为0
最终期望得到的结果:
ID cond press metrics ratios 0 h1 new 30 1.2 1.0/1.2 1 h2 old 30 1.0 0 2 h3 new 50 1.5 1.4/1.5 3 h4 old 50 1.4 0 4 h5 new 70 1.8 0
解决方案(Python Pandas实现)
可以通过以下代码实现需求:
import pandas as pd # 构造原始数据集 data = { 'ID': ['h1', 'h2', 'h3', 'h4', 'h5'], 'cond': ['new', 'old', 'new', 'old', 'new'], 'press': [30, 30, 50, 50, 70], 'metrics': [1.2, 1.0, 1.5, 1.4, 1.8] } df = pd.DataFrame(data) # 提取每个press对应的old组metrics值 old_metrics = df[df['cond'] == 'old'].set_index('press')['metrics'].rename('old_metric') # 合并原数据与匹配到的old组metrics值 df = df.merge(old_metrics, on='press', how='left') # 生成ratios列 df['ratios'] = df.apply( lambda row: f"{row['old_metric']}/{row['metrics']}" if row['cond'] == 'new' and pd.notna(row['old_metric']) else 0, axis=1 ) # 删除中间辅助列 df = df.drop(columns='old_metric') # 打印结果 print(df.to_string(index=False))
运行代码后输出的结果与期望一致:
ID cond press metrics ratios h1 new 30 1.2 1.0/1.2 h2 old 30 1.0 0 h3 new 50 1.5 1.4/1.5 h4 old 50 1.4 0 h5 new 70 1.8 0
内容的提问来源于stack exchange,提问作者Jinbo
相关产品推荐
相关产品推荐

