You need to enable JavaScript to run this app. 利用DataFrame分类变量值创建新表及Series报错解决
优惠活动
大模型
产品
解决方案
定价
更多

利用DataFrame分类变量值创建新表及Series报错解决

问题原因说明

你原有列表推导式报错的核心原因是:s['O_Status'] == 'Closed'返回的是和原DataFrame长度一致的布尔Series,并非单个布尔值,列表推导式的if判断无法识别多元素Series的真假,因此触发truth value of a Series is ambiguous报错。

可行实现方案

1. 提取Closed状态对应的Cost值

优先使用pandas原生布尔索引实现,效率远高于纯列表推导式:
FClose = s.loc[s['O_Status'] == 'Closed', 'Cost'].tolist()
如果必须用列表推导式逻辑,需要先将对应行的Cost和O_Status值配对遍历:
FClose = [cost for cost, status in zip(s['Cost'], s['O_Status']) if status == 'Closed']

2. 生成按O_Status分类存储Cost的新DataFrame

你要的双列格式可以通过以下两种方案实现:

方案一:手动拼接分类数据(适合分类固定的场景)

  • 分别提取两类状态的Cost值,重置索引避免行号错位
closed_costs = s.loc[s['O_Status'] == 'Closed', 'Cost'].reset_index(drop=True)
operating_costs = s.loc[s['O_Status'] == 'Operating', 'Cost'].reset_index(drop=True)
  • 直接构造新DataFrame
new_df = pd.DataFrame({
    'Closed': closed_costs,
    'Operating': operating_costs
})

方案二:通用透视实现(适合分类可能扩展的场景)

如果后续O_Status会新增其他取值(如Cancelled、Pending等),用这个方法无需手动修改代码即可自动生成对应列:

# 给每个相同O_Status的行加自增序号,作为对齐行的依据
s['row_idx'] = s.groupby('O_Status').cumcount()
# 透视生成目标格式的表
new_df = s.pivot(index='row_idx', columns='O_Status', values='Cost')
# 清理多余的索引元信息
new_df.columns.name = None
new_df = new_df.reset_index(drop=True)

注意:若两类状态的样本数不一致,数量较少的类别对应的剩余行将自动填充NaN,属于正常逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 10:06:03