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

