读取含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'
问题根源
- 数据类型错误:
csv.reader读取的所有内容默认都是字符串类型,即使CSV中是数字,转成DataFrame后y列仍为字符串,执行除法运算时字符串与整数无法兼容,触发报错。 - 文件读取路径错误:原脚本读取的是本地
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
相关产品推荐
相关产品推荐

