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

多数据集最后列百分比差异计算求助:ratio函数返回NaN

解决数据集两两最后一列百分比差异计算的NaN问题

明确百分比差异计算逻辑

通常百分比差异采用公式:((数据集B最后一列值 - 数据集A最后一列值) / 数据集A最后一列值) * 100
若需基于两者均值计算差异,可用:((B - A)/((A+B)/2))*100,根据需求选择即可。

NaN问题的常见原因及解决办法

1. 数据集索引未对齐

你的数据集以日期为第一列,若读取后未将日期设为索引、或日期格式不统一(比如一个是字符串,一个是datetime类型),会导致对应行无法匹配,计算时出现NaN。
解决方式:
读取每个数据集时,指定日期列为索引并转为datetime类型:

import pandas as pd

# 读取单个数据集示例(适配空格分隔的文本格式)
df1 = pd.read_csv('dataset1.txt', sep='\s+', parse_dates=[0], index_col=0)
df2 = pd.read_csv('dataset2.txt', sep='\s+', parse_dates=[0], index_col=0)

2. 数据集中存在0值

若数据集A的最后一列存在0值,除以0会直接产生NaN或无穷大,需针对性处理:

# 提取两个数据集的最后一列
col_a = df1.iloc[:, -1]
col_b = df2.iloc[:, -1]

# 计算百分比差异,同时规避除以0的情况
pct_diff = ((col_b - col_a) / col_a.where(col_a != 0)) * 100
# 对无法计算的行,可根据需求填充默认值(比如0)
pct_diff = pct_diff.fillna(0)

3. 误用ratio函数

多数数据处理库没有直接适配你需求的ratio函数,手动实现百分比差异逻辑更可靠,避免因函数内置逻辑不符导致的错误。

批量处理16个数据集的两两对比

将所有数据集存入列表,通过双重循环遍历所有两两组合:

# 假设数据集文件名为dataset1.txt至dataset16.txt
datasets = []
for idx in range(1, 17):
    df = pd.read_csv(f'dataset{idx}.txt', sep='\s+', parse_dates=[0], index_col=0)
    # 存储数据集名称和最后一列数据
    datasets.append((f'dataset{idx}', df.iloc[:, -1]))

# 遍历所有两两组合计算差异
for i in range(len(datasets)):
    name_a, col_a = datasets[i]
    for j in range(i+1, len(datasets)):
        name_b, col_b = datasets[j]
        pct_diff = ((col_b - col_a) / col_a.where(col_a != 0)) * 100
        # 输出或保存结果
        print(f"{name_a} vs {name_b} 百分比差异:")
        print(pct_diff)
        pct_diff.to_csv(f'{name_a}_vs_{name_b}_pct_diff.csv')

结果验证

用你给出的示例数据测试:
df1最后一列:[8,10,6,4],df2最后一列:[8,12,2,3]
计算后应得到:

  • 1980-01-01: 0%
  • 1981-01-01: 20%
  • 1982-01-01: ≈-66.67%
  • 1983-01-01: -25%
    若输出此结果,说明计算逻辑正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:53:17