Pandas DataFrame按行统计1的个数报错:Series真值模糊
解决Pandas每行统计值为1的元素个数问题
错误原因
你用apply(axis=1)时,lambda里的参数其实是整行的Series对象,你的isOne函数直接拿整个Series和1比较,x == 1返回的是布尔值组成的Series,用if判断整个Series的真值会触发模糊性错误——Pandas不允许直接判断一个Series的真假,因为无法确定你要的是任意元素为真还是全部元素为真。
最简解决方案(推荐)
直接用Pandas的向量化操作,比apply效率高得多:
df.eq(1).sum(axis=1)
df.eq(1):生成和原DataFrame同形状的布尔DataFrame,每个位置标记是否等于1sum(axis=1):横向(按行)求和,布尔值True会被当作1计算,False当作0,直接得到每行1的个数
用apply的修正方案
如果一定要保留apply的写法,修改逻辑,直接对行Series做统计:
# 自定义函数版 def count_one(row): return (row == 1).sum() df.apply(count_one, axis=1) # 简化lambda版 df.apply(lambda row: (row == 1).sum(), axis=1)
这里不需要单独的if判断,Pandas支持对Series做向量化比较,直接求和就能得到1的数量。
为什么你加any()/all()没用
你之前尝试加的any()/all()会把布尔Series转换成单个布尔值(比如any()返回True表示行里至少有一个1),再sum的结果只能是1或0,完全不是你要的统计个数,所以无效。
内容的提问来源于stack exchange,提问作者Scott Bing
相关产品推荐
相关产品推荐

