You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:24:58