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

如何在含NaN的DataFrame score列分段求各段极值

解决方法:提取NaN前分段的极值

嘿,这个需求很明确,我们可以通过两种方式来实现——一种是基于你已经转换好的列表处理,另一种是直接用Pandas原生方法更高效地操作DataFrame。

方法一:基于列表的遍历处理

既然你已经把DataFrame的score列转成了列表,那我们可以直接遍历列表,收集每个NaN前的元素分段,再计算极值:

import math

# 你的示例列表(也可以直接用你转换好的score_list)
score_list = [11.03680137760893, 5.351482041139766, 10.10019513222711, float('nan'), 0.960990030082931, float('nan'), 6.46983084276682, 32.46794015293125, float('nan')]

current_segment = []
segment_count = 1

for num in score_list:
    if not math.isnan(num):
        # 非NaN元素加入当前分段
        current_segment.append(num)
    else:
        # 遇到NaN时,计算当前分段的极值(跳过空分段,比如连续NaN的情况)
        if current_segment:
            seg_max = max(current_segment)
            seg_min = min(current_segment)
            print(f"第{segment_count}个NaN前的分段:最大值{seg_max}、最小值{seg_min}")
            segment_count += 1
            # 重置分段,准备收集下一段元素
            current_segment = []

# 额外处理:如果列表末尾没有NaN,剩下的元素也要计算极值
if current_segment:
    seg_max = max(current_segment)
    seg_min = min(current_segment)
    print(f"最后一段(无后续NaN):最大值{seg_max}、最小值{seg_min}")

代码说明:

  • 用current_segment临时存储当前正在收集的非NaN元素,segment_count标记是第几个NaN前的分段
  • 遇到NaN时,检查当前分段是否有元素(避免连续NaN导致空列表报错),然后计算并打印极值,之后重置分段
  • 最后加了兜底逻辑,处理列表末尾没有NaN的情况

运行这段代码后,输出和你需要的完全一致:

第1个NaN前的分段:最大值11.03680137760893、最小值5.351482041139766
第2个NaN前的分段:最大值0.960990030082931、最小值0.960990030082931
第3个NaN前的分段:最大值32.46794015293125、最小值6.46983084276682

方法二:直接用Pandas原生方法(更高效)

如果你不需要转成列表,直接操作DataFrame会更简洁,利用Pandas的分组功能就能快速得到结果:

import pandas as pd
import numpy as np

# 示例DataFrame(替换成你的description_df即可)
df = pd.DataFrame({'score': [11.03680137760893, 5.351482041139766, 10.10019513222711, np.nan, 0.960990030082931, np.nan, 6.46983084276682, 32.46794015293125, np.nan]})

# 生成分段标记:每遇到一个NaN,分段编号+1
df['segment'] = df['score'].isna().cumsum()

# 过滤掉NaN行,按分段分组计算最大值和最小值
result = df[df['score'].notna()].groupby('segment')['score'].agg(['max', 'min'])

print(result)

代码说明:

  • df['score'].isna().cumsum()会给每个NaN前的元素分配相同的分段编号,比如第一个NaN前的元素都是0,第二个NaN前的是1,以此类推
  • 过滤掉NaN行后,用groupby和agg一次性计算每个分段的极值

运行后输出的结果如下:

max       min
segment                    
0       11.036801  5.351482
1        0.960990  0.960990
2       32.467940  6.469831

你可以根据自己的习惯选择其中一种方法,两种都能完美满足你的需求~

内容的提问来源于stack exchange,提问作者developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:48:16