Python Pandas:大DataFrame中无迭代统计模式出现次数
高效统计DataFrame中连续模式出现次数的方法
嘿,处理超大DataFrame可千万别逐行遍历,那效率简直灾难!咱们用pandas的向量化操作来搞定,既快又符合Python风格,分两种思路给你讲:
1) 更高效的实现方式
核心是用向量化移位比较,完全绕开Python层面的循环,让pandas用底层C语言执行操作,速度能提升好几个数量级,完美适配超大数据集。
思路很简单:要找连续三个I(或O),就判断当前行和它的前两行是否完全等于目标值,统计每列中满足条件的行数就是模式出现的次数。
代码示例:
import pandas as pd # 先定义一个通用函数,统计单列中连续三个目标值的次数 def count_consecutive_col(col, target_val): # 比较当前行、上一行、上上行是否都等于目标值 match_mask = (col == target_val) & (col == col.shift(1)) & (col == col.shift(2)) return match_mask.sum() # 假设你的DataFrame名为df # 统计每列中'I I I'的出现次数 count_iii = df.apply(count_consecutive_col, target_val='I') # 统计每列中'O O O'的出现次数 count_ooo = df.apply(count_consecutive_col, target_val='O')
这个方法没有任何显式循环,所有运算都是pandas内置的向量化操作,处理超大DataFrame时的性能碾压逐行遍历。
2) 更Pythonic的实现方式
如果追求代码简洁性,用rolling窗口结合lambda表达式是非常Pythonic的写法,可读性拉满,代码也更紧凑:
# 统计每列连续三个'I'的次数 count_iii = df.rolling(window=3).apply(lambda win: (win == 'I').all()).sum() # 统计每列连续三个'O'的次数 count_ooo = df.rolling(window=3).apply(lambda win: (win == 'O').all()).sum()
这里rolling(window=3)会生成每个长度为3的滑动窗口,lambda函数判断窗口内是否全为目标值,最后求和得到每列的模式出现次数。虽然比移位法稍慢一点点,但代码更简洁直观,完全符合Python的简洁哲学。
如果还想再极致一点,用列表推导式也能实现,但可读性稍差,不如上面两种方法优雅:
count_iii = pd.Series( [((df[col] == 'I') & (df[col] == df[col].shift(1)) & (df[col] == df[col].shift(2))).sum() for col in df.columns], index=df.columns )
内容的提问来源于stack exchange,提问作者Windstorm1981
相关产品推荐
相关产品推荐

