在Pandas中按行计算唯一值时排除值0的实现方法
解决Pandas按行计算唯一值并排除0的问题
嘿,我来帮你搞定这个需求~首先咱们先重现你给出的数据集:
import pandas as pd d = {'col1': [1, 2, 3], 'col2': [3, 4, 0], 'col3': [0, 4, 0],} df = pd.DataFrame(data=d)
对应的DataFrame长这样:
col1 col2 col3 0 1 3 0 1 2 4 4 2 3 0 0
你说直接用df.nunique(axis=1)会把0也算进去,确实不符合要求,这里给你两种实用的解决方案:
方法一:把0替换成NaN再用nunique
Pandas的nunique()方法默认会忽略NaN值,所以咱们先把所有0替换成缺失值,再按行统计唯一值数量就行:
df['uniques'] = df.replace(0, pd.NA).nunique(axis=1)
执行完之后,你就能得到想要的结果:
col1 col2 col3 uniques 0 1 3 0 2 1 2 4 4 2 2 3 0 0 1
方法二:用apply自定义过滤逻辑
如果你需要更灵活地控制排除规则(比如以后要排除其他值),可以用apply()配合lambda函数,手动过滤掉0后统计唯一值:
df['uniques'] = df.apply(lambda row: len(set(x for x in row if x != 0)), axis=1)
这个方法会逐行遍历,生成一个剔除0的元素集合,集合的长度就是咱们要的唯一值数量,结果和第一种方法完全一致。
两种方法都能解决问题,第一种更简洁高效,适合大多数场景;第二种扩展性更强,适合需要自定义规则的情况。
内容的提问来源于stack exchange,提问作者Hardik Gupta
相关产品推荐
相关产品推荐

