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列是空的,没有生成预期的注释内容。
排查与解决
核心问题分析
- 条件范围过窄:你的代码只处理了
SOI priority == 1且Stake>10的场景,其他所有情况(比如SOI priority为其他数值、Stake<=10)都没有赋值逻辑,导致这些行的注释列保持初始空值。 - 判断逻辑与显示值脱节:你先用原始计算的
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
相关产品推荐
相关产品推荐

