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

Python Pandas数值比较在部分场景下失效问题排查

问题

我想在Pandas DataFrame中新增一列生成注释:当%Stake大于10时,注释为SOI1&Stake>10;当%Stake小于等于10时,注释为SOI1&Stake<=10,以此类推。但编写代码后发现部分%Stake明显大于10的行并未生成对应注释,这些行的Priority comment列始终为空。

附上代码:

treasury_shares.insert(5, "%Stake",
                       treasury_shares['share_class_level_treasury_shares_as_reported'] / treasury_shares[
                           'issued_shares_as_reported'], True)
    # treasury_shares.insert(6, "SOI priority",soiValues['attribute_value'], True)
    # treasury_shares.loc[:,'%Stake'] *= 100
    # treasury_shares['%Stake'].apply(np.floor)
treasury_shares['Priority comment']=""

temp = treasury_shares['%Stake'].astype(float) * 100

treasury_shares['new_conditional'] = np.where(
    (temp > float(10)) &
    (treasury_shares['SOI priority'].astype('int32') == 1),
    1, 0
).astype('int32')

# Using the mask for your conditionals, where the same column is changed
treasury_shares['Priority comment'] = np.where(treasury_shares['new_conditional'] == 1,
                                               'SOI' + (treasury_shares[
                                                   'SOI priority']).astype('string') + '&Stake>10',
                                               treasury_shares['Priority comment'])

print(treasury_shares['Priority comment'])
treasury_shares['%Stake'] = round(treasury_shares['%Stake'] * 100, 0).astype(str) + "%"
# treasury_shares["%Stake"] = treasury_shares["%Stake"].str.replace(".0", "")
treasury_shares = treasury_shares.reindex(
    columns=["performance_id", "SOI priority", "total_shares_outstanding_date", "issued_shares_as_reported",
             "share_class_level_treasury_shares_as_reported",
             "share_class_level_total_shares_outstanding_as_reported", "%Stake", "Priority comment"])

输出情况:部分显示%Stake为100%、50%的行,Priority comment列是空的,没有生成预期的注释内容。

排查与解决

核心问题分析

  1. 条件范围过窄:你的代码只处理了SOI priority == 1且Stake>10的场景,其他所有情况(比如SOI priority为其他数值、Stake<=10)都没有赋值逻辑,导致这些行的注释列保持初始空值。
  2. 判断逻辑与显示值脱节:你先用原始计算的temp做判断,之后对%Stake做了四舍五入格式化,导致显示的百分比和实际判断的数值可能存在偏差(比如原始temp=9.9,格式化后显示10%,但判断时会归为<=10)。

修复后的代码示例

treasury_shares.insert(5, "%Stake",
                       treasury_shares['share_class_level_treasury_shares_as_reported'] / treasury_shares[
                           'issued_shares_as_reported'], True)

# 先计算原始 stake 百分比,避免后续格式化影响判断逻辑
treasury_shares['stake_percent'] = treasury_shares['%Stake'].astype(float) * 100

# 初始化注释列
treasury_shares['Priority comment'] = ""

# 处理 Stake>10 的所有 SOI priority 情况
mask_gt10 = treasury_shares['stake_percent'] > 10
treasury_shares.loc[mask_gt10, 'Priority comment'] = (
    'SOI' + treasury_shares['SOI priority'].astype(str) + '&Stake>10'
)

# 处理 Stake<=10 的所有 SOI priority 情况
mask_le10 = treasury_shares['stake_percent'] <= 10
treasury_shares.loc[mask_le10, 'Priority comment'] = (
    'SOI' + treasury_shares['SOI priority'].astype(str) + '&Stake<=10'
)

# 格式化显示 %Stake 列
treasury_shares['%Stake'] = round(treasury_shares['stake_percent'], 0).astype(str) + "%"

# 重新排列列
treasury_shares = treasury_shares.reindex(
    columns=["performance_id", "SOI priority", "total_shares_outstanding_date", "issued_shares_as_reported",
             "share_class_level_treasury_shares_as_reported",
             "share_class_level_total_shares_outstanding_as_reported", "%Stake", "Priority comment"])

# 可选:删除中间计算列
# treasury_shares.drop('stake_percent', axis=1, inplace=True)

额外注意事项

  • 确保SOI priority列无缺失值或非数值类型,可提前用treasury_shares['SOI priority'].fillna(0, inplace=True)处理缺失值。
  • 如果需要严格匹配显示的%Stake数值来判断(比如显示10%时按>10处理),可以基于格式化后的%Stake列提取数值判断,但不建议——四舍五入会导致逻辑和原始数据脱节,优先基于原始计算的stake_percent判断更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:27:26