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

Python中基于DataFrame行元素创建新列,未找到可用的pivot解决方案

原有代码问题说明

  • 语法错误:Python原生字符串判断包含的语法是'Up' in i,而非i contains 'Up'
  • 逻辑错误:循环内直接对df['UpNumber']整列赋值,会用最后一次匹配结果覆盖所有行,无法实现行级条件映射

可行实现方案

这里提供两种常用实现方式,都可以直接得到你需要的结果:

方法1:使用pivot实现(推荐,代码最简洁)

针对你这种行转列的典型场景,pandas内置的pivot方法完全可以满足需求,示例代码如下:

import pandas as pd

# 构造示例数据(你自己的场景可以跳过这步,直接用自己的df)
data = {
    'Name': ['John Smith', 'John Smith', 'Michael Johnson', 'Michael Johnson'],
    'Up/Down': ['Up', 'Down', 'Up', 'Down'],
    'NumberA': [10.5, 10.5, 7.5, 7.5],
    'NumberB': ['+500', '-775', '-200', '-100']
}
df = pd.DataFrame(data)

# 核心转换逻辑
res = df.pivot(
    index=['Name', 'NumberA'],  # 固定不变的列作为索引
    columns='Up/Down',  # 要转成新列的字段
    values='NumberB'  # 新列的值来源字段
).reset_index().rename(columns={'Up': 'UpNumber', 'Down': 'DownNumber'})
res.columns.name = None  # 清除pivot生成的列名前缀
print(res)

方法2:拆分后合并(适合对pivot不熟悉的场景)

如果你更习惯用merge的方式,可以拆分Up、Down两个子集后按公共字段合并,代码如下:

# 拆分Up、Down子集并重命名
up_df = df[df['Up/Down'] == 'Up'][['Name', 'NumberA', 'NumberB']].rename(columns={'NumberB': 'UpNumber'})
down_df = df[df['Up/Down'] == 'Down'][['Name', 'NumberA', 'NumberB']].rename(columns={'NumberB': 'DownNumber'})
# 按Name和NumberA合并得到结果
res = pd.merge(up_df, down_df, on=['Name', 'NumberA'], how='outer')

两种方法运行后得到的res就是你需要的目标表结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:10