如何在Pandas DataFrame中统计每行指定值的出现次数?
需求与问题
我希望编写一个函数,在Pandas DataFrame的每行中搜索'cam1'或'cam2',并将匹配次数作为新列输出。
现有DataFrame定义如下:
import pandas as pd df = pd.DataFrame({'A':['cam1','cam2','cam1','cam4'],'B':['cam2', 'cam1', 'cam4', 'cam3'],'C':['cam3','cam4', 'cam5','cam2']})
对应的表格:
| A | B | C | |
|---|---|---|---|
| 0 | cam1 | cam2 | cam3 |
| 1 | cam2 | cam1 | cam4 |
| 2 | cam1 | cam4 | cam5 |
| 3 | cam4 | cam3 | cam2 |
期望输出为添加Count列的DataFrame:
| A | B | C | Count | |
|---|---|---|---|---|
| 0 | cam1 | cam2 | cam3 | 2 |
| 1 | cam2 | cam1 | cam4 | 2 |
| 2 | cam1 | cam4 | cam5 | 1 |
| 3 | cam4 | cam3 | cam2 | 1 |
请问是否可以不使用大量if-else语句实现该需求?
实现方案
完全可以不用大量if-else语句,Pandas提供了多种简洁的向量化操作来高效实现这个需求,以下是几种实用方法:
方法一:isin() + sum()(推荐)
利用isin()判断每个元素是否属于目标列表,再按行求和,这是最简洁高效的向量化实现:
targets = ['cam1', 'cam2'] df['Count'] = df.isin(targets).sum(axis=1)
方法二:多条件eq() + sum()
如果需要单独指定匹配值,可通过等于判断后累加次数:
df['Count'] = (df == 'cam1').sum(axis=1) + (df == 'cam2').sum(axis=1)
方法三:apply()配合简单判断(灵活但效率稍低)
如果需要自定义更复杂的匹配逻辑,可使用apply,但此方法适合小数据集,大数据集优先选用前两种向量化方法:
def count_matches(row): count = 0 for val in row: if val in ['cam1', 'cam2']: count += 1 return count df['Count'] = df.apply(count_matches, axis=1)
以上方法均无需堆砌if-else语句,前两种向量化操作的执行效率远高于循环判断。
内容的提问来源于stack exchange,提问作者pythonTyler
相关产品推荐
相关产品推荐

