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
相关产品推荐
相关产品推荐

