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

读取含X/Y列的CSV计算Y列累积移动平均时脚本报错求助

问题排查:TypeError: unsupported operand type(s) for /: 'str' and 'int'

问题背景

尝试读取GitHub指定链接的CSV文件(含X、Y两列),运行Python脚本时触发类型错误,报错信息为TypeError: unsupported operand type(s) for /: 'str' and 'int'。

原脚本

import numpy as np
from pandas import DataFrame as df
import csv

origin_data = open("file.csv", "r")
dato = list(csv.reader(origin_data, delimiter=","))
print(dato)

rowcount  = 0
#iterating through the whole file
for row in dato:
  rowcount+= 1
#printing the result
#_ print("Number of lines present:-", rowcount)
print(rowcount)

dati = df(dato, columns=['x', 'y'])

window = 6
roll_avg = dati.rolling(window).mean()

roll_avg_cumulative = dati['y'].cumsum()/np.arange(1, 25)
print(roll_avg_cumulative)

报错详情

Traceback (most recent call last):
  File "/home/haz/miniconda39/lib/python3.9/site-packages/pandas/core/ops/array_ops.py", line 163, in _na_arithmetic_op
    result = func(left, right)
  File "/home/haz/miniconda39/lib/python3.9/site-packages/pandas/core/computation/expressions.py", line 239, in evaluate
    return _evaluate(op, op_str, a, b)  # type: ignore[misc]
  File "/home/haz/miniconda39/lib/python3.9/site-packages/pandas/core/computation/expressions.py", line 128, in _evaluate_numexpr
    result = _evaluate_standard(op, op_str, a, b)
  File "/home/haz/miniconda39/lib/python3.9/site-packages/pandas/core/computation/expressions.py", line 69, in _evaluate_standard
    return op(a, b)
TypeError: unsupported operand type(s) for /: 'str' and 'int'

问题根源

  1. 数据类型错误:csv.reader读取的所有内容默认都是字符串类型,即使CSV中是数字,转成DataFrame后y列仍为字符串,执行除法运算时字符串与整数无法兼容,触发报错。
  2. 文件读取路径错误:原脚本读取的是本地file.csv,并未从指定的GitHub链接获取文件,且GitHub的blob链接无法直接用于文件读取,需使用原始文件链接。

修复方案

1. 修正GitHub文件读取链接

将GitHub的blob链接替换为原始文件链接:把https://github.com/hamzaal014/file/blob/main/file.csv改为https://github.com/hamzaal014/file/raw/main/file.csv,该链接可直接用于pandas读取。

2. 使用pandas直接读取并自动识别数据类型

pandas.read_csv会自动将CSV中的数字列识别为数值类型,无需手动处理字符串转换,同时简化代码逻辑。

3. 修复后的完整代码

import numpy as np
import pandas as pd

# 读取GitHub上的原始CSV文件
csv_url = "https://github.com/hamzaal014/file/raw/main/file.csv"
# 如果CSV本身有表头,删除names参数
dati = pd.read_csv(csv_url, names=['x', 'y'])

# 获取行数,替代手动循环计数
rowcount = len(dati)
print(f"行数: {rowcount}")

window = 6
roll_avg = dati.rolling(window).mean()

# 保险起见,确保y列为数值类型(处理可能的异常值)
dati['y'] = pd.to_numeric(dati['y'], errors='coerce')
# 根据实际行数生成除数数组,避免硬编码25
roll_avg_cumulative = dati['y'].cumsum() / np.arange(1, len(dati)+1)
print(roll_avg_cumulative)

补充说明

  • 若CSV文件包含表头行,需删除names=['x', 'y']参数,防止表头被识别为数据行。
  • pd.to_numeric(errors='coerce')会将无法转换为数字的内容转为NaN,避免后续计算再次触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:30:40