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

为何Pandas中基于bool类型Fee列的分组累加代码失效?

问题

构造如下DataFrame:

import pandas as pd
data = {'ID': [1,1,1,1,1,1,2,2,2,2,2,2,2],
            'Fee': ['False', 'False', 'True','False','False','False','False', 'False','False','True','False','False','False']}
df=pd.DataFrame(data)

需求是新增一列Bool:每个ID分组内Fee列的'True'之前的行值为0,之后的行值为1,'True'所在行的值为0或1均可,期望结果如下:

ID    Fee  Bool
0    1  False     0
1    1  False     0
2    1   True     0
3    1  False     1
4    1  False     1
5    1  False     1
6    2  False     0
7    2  False     0
8    2  False     0
9    2   True     0
10   2  False     1
11   2  False     1
12   2  False     1

通过以下代码实现了需求:

df['Bool'] = df['Fee'].eq('True').groupby(df.ID).cumsum().astype(int)

但从CSV读取相同数据时,Fee列变为bool类型,此时上述代码生成的Bool列全为0。想知道该现象的原因。

原因分析
  • 字符串与布尔值的比较逻辑差异:
    当Fee是字符串类型时,df['Fee'].eq('True')会精准匹配字符串值'True',得到一个布尔Series——只有Fee为'True'的行是True,其余为False。分组后cumsum()会将布尔值视为1和0累加,从而得到符合需求的0、1序列。
    当Fee是布尔类型时,df['Fee'].eq('True')是把布尔值(True/False)和字符串'True'做跨类型比较。由于类型不匹配,布尔值True不等于字符串'True',布尔值False也不等于字符串'True',所以整个Series的结果全是False。后续分组cumsum()累加的全是0,最终Bool列自然全为0。

  • 布尔类型列的正确用法:
    如果Fee是布尔类型,直接用df['Fee']即可得到标记目标行的布尔Series,无需额外调用eq方法,正确代码应为:

    df['Bool'] = df['Fee'].groupby(df.ID).cumsum().astype(int)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:05:22