如何使用Python(pandas)统计指定列数据及连续相邻特定值数量
Pandas统计列中连续指定值相邻对的实现方法
原代码的问题
你写的代码跑不通是几个低级错误叠加导致的:
- 变量、列名、测试数据不统一:测试数据里列名写的是
A,代码里取的是Color列;遍历对象一会是data一会是finalData;循环里用的i没有初始化;测试数据里的green/red没加引号是未定义变量 - 运算符优先级错误:
&是pandas逐位与运算符,优先级比==高,你写的判断条件会先执行'green' & finalData['Color'].loc[i+1],逻辑完全错误 - 循环逻辑漏洞:遍历到最后一行时取
i+1会触发索引越界,i+=1写在if分支里会导致索引步进混乱 - 索引用法错误:遍历行的时候优先用
iloc按位置取值,不要混用loc的标签索引和自增数字索引,很容易踩坑
推荐的向量化实现(通用高效)
pandas做这类统计不要写iterrows循环,效率极低,用内置的移位方法几行代码就能搞定,而且数据量越大优势越明显:
import pandas as pd # 先构造正确的测试数据,字符串值要加引号,列名和后续使用保持一致 df = pd.DataFrame( [['green'], ['green'], ['red'], ['green'], ['green'], ['green']], columns=['Color'] ) # 核心逻辑:逐行判断当前行和下一行是否同时为green cur_green = df['Color'] == 'green' next_green = df['Color'].shift(-1) == 'green' # shift(-1)将列向上平移1位,当前位置存储原下一行的值 continuous_green_pair = (cur_green & next_green).sum() print(continuous_green_pair) # 上述测试数据输出为3:第0-1行1对,第3-4、4-5行共2对,总计3对
这个方法是通用的:要统计其他值的连续相邻对,只要把判断条件里的'green'替换成目标值即可;要做多列组合的连续统计,只要追加对应的判断条件就行。
不推荐的循环写法(仅做参考)
如果你刚接触pandas想先理解循环逻辑,可以参考下面的正确写法,但是生产环境绝对不要这么写,万行以上数据速度会比向量化写法慢几十上百倍:
count = 0 # 最多遍历到倒数第二行,避免i+1索引越界 for i in range(len(df) - 1): # 标量值的逻辑判断用and,不要用逐位运算符& if df['Color'].iloc[i] == 'green' and df['Color'].iloc[i+1] == 'green': count += 1
内容的提问来源于stack exchange,提问作者Nidal Zd
相关产品推荐
相关产品推荐

