如何用Pandas遍历DataFrame生成羽毛球得分分析新DataFrame
嘿,我来帮你解决这个羽毛球得分转换的问题!你的需求很明确:把每一分的得分转换成0/1标记——如果下一分是当前得分+1就记1,否则记0,对吧?下面我给你两种实现方式,一种是Pandas推荐的高效矢量化方法,另一种是你原本想尝试的itertuples遍历方法。
方法一:高效矢量化操作(推荐)
Pandas最擅长的就是矢量化操作,这种方法不需要手动遍历,速度更快,尤其适合数据量较大的情况。核心思路是利用diff()计算相邻得分的差值,判断差值是否等于1(也就是下一分比当前多1),最后给最后一个位置补0(因为没有下一分可以比较)。
代码示例:
import pandas as pd # 用你的示例数据创建DataFrame data = [[0, 0, 1, 1, 2, 3, 4, 0, 1, 2, 3, 3, 4, 4]] score_df = pd.DataFrame(data) # 定义处理单一行的函数 def convert_score_row(row): # 计算后一列减前一列的差值,dropna()去掉第一个NaN(因为第一列没有前值) score_diffs = row.diff().dropna() # 判断差值是否为1,转成整数0/1,再转成列表 converted_marks = (score_diffs == 1).astype(int).tolist() # 最后一个位置补0(没有下一分可比较) converted_marks.append(0) return pd.Series(converted_marks) # 把函数应用到每一行,得到结果DataFrame result_df = score_df.apply(convert_score_row, axis=1)
运行后result_df就会输出你想要的结果:0 0 1 0 1 1 1 0 1 1 1 0 1 0。
方法二:使用itertuples遍历实现你的原始思路
如果你想坚持用itertuples来遍历,其实很简单——这个生成器每次返回一行的元组数据,你可以把它转成列表后逐个元素比较:
import pandas as pd data = [[0, 0, 1, 1, 2, 3, 4, 0, 1, 2, 3, 3, 4, 4]] score_df = pd.DataFrame(data) result_data = [] # 遍历每一行,index=False表示不返回行索引 for row_tuple in score_df.itertuples(index=False): row_list = list(row_tuple) converted = [] # 遍历到倒数第二个元素,因为要和下一个元素比较 for i in range(len(row_list) - 1): current_score = row_list[i] next_score = row_list[i+1] # 判断下一分是否是当前+1 converted.append(1 if next_score == current_score + 1 else 0) # 最后一个位置补0 converted.append(0) result_data.append(converted) # 转换成结果DataFrame result_df = pd.DataFrame(result_data)
这种方法逻辑更直观,和你最初的想法完全匹配,但要注意:当你的DataFrame有很多行时,遍历的效率会比矢量化操作低很多,所以小数据量用它没问题,大数据量更推荐第一种方法。
内容的提问来源于stack exchange,提问作者NeuroLogik
相关产品推荐
相关产品推荐

