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

Python Pandas处理CSV大型矩阵时出现‘str’ object has no attribute ‘values’错误的原因解析求助

问题分析与代码修复

咱们先拆解你遇到的'str' object has no attribute 'values'错误根源,再一步步把代码理顺:

错误核心原因

这个错误直接来自两处代码写法问题:

for i in set(data['MovementNumber'.]):
    data2 = data.loc[['MovementNumber'] == i]
  1. 语法错误导致列名失效:data['MovementNumber'.]里多了个多余的句号,Python会把'MovementNumber'.当成带句号的字符串去匹配列名,完全偏离了你要访问的MovementNumber列。
  2. 行过滤逻辑完全错误:['MovementNumber'] == i是把一个字符串列表和循环变量i做比较,得到的是单个布尔值(比如False),用这个布尔值去索引data.loc,最终得到的data2根本不是过滤后的DataFrame,反而可能是单个字符串/标量。后续调用data2['PlayerPosX'].values时,本质是对字符串调用.values方法,自然触发错误。

其他需要修正的代码问题

除了触发错误的点,还有几个可以优化的细节:

  • data = pd.DataFrame(bigdata)完全多余:pd.read_csv()返回的本身就是DataFrame,不需要二次转换。
  • i = np.iterable(data.columns)毫无意义:你既没用到这个变量,后面还把i作为循环变量覆盖了,直接删掉即可。
  • 列名存在重复:比如TargetPosZ、PlayerPosX都重复出现,这会导致后续访问列时出现歧义,建议修正为唯一列名。
  • 你的原始目标是处理第4列MovementTime(对应代码里的Movement Time)并排序,但当前函数里没有相关逻辑,后面会补充实现。

修正后的完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 读取CSV文件,无需额外转换为DataFrame
bigdata = pd.read_csv(r'Assetslog_912021_11.csv')

def analytics(data):
    # 修正重复列名,确保每个列名唯一
    data.columns = [
        'Time', 'Fixed Delta', 'Movement Time', 'MovementNumber', 
        'Rest Flag', 'DistortionDigit', 'RobotForceX','RobotForceY','RobotForceZ', 
        'PrevPositionX','PrevPositionY','PrevPositionZ', 
        'TargetPosX', 'TargetPosY', 'TargetPosZ',  # 修复重复的TargetPosZ
        'PlayerPosX', 'PlayerPosY', 'PlayerPosZ',  # 修复重复的PlayerPosX
        'RobotVelX','RobotVelY','RobotVelZ', 
        'LocalPosX', 'LocalPosY', 'LocalPosZ', 
        'PerpError', 'ExtError'
    ]
    
    # 实现你的原始目标:提取Movement Time列并排序
    movement_time = data['Movement Time']
    sorted_movement_time = movement_time.sort_values()
    print("排序后的Movement Time数据(前5行):")
    print(sorted_movement_time.head())
    
    # 修复后的3D散点图逻辑
    # 确保MovementNumber为数值类型,过滤无效值
    data['MovementNumber'] = pd.to_numeric(data['MovementNumber'], errors='coerce')
    valid_data = data.dropna(subset=['MovementNumber'])
    
    for mov_num in set(valid_data['MovementNumber']):
        print(f"Plot for Movement Number {mov_num}")
        # 正确的行过滤方式:使用布尔索引
        data2 = valid_data.loc[valid_data['MovementNumber'] == mov_num]
        # 空数据时跳过绘图,避免报错
        if not data2.empty:
            ax = plt.axes(projection='3d')
            xdata = data2['PlayerPosX'].values
            ydata = data2['PlayerPosY'].values
            zdata = data2['PlayerPosZ'].values
            ax.scatter3D(xdata, ydata, zdata, c=zdata)
            plt.show()
        else:
            print(f"No valid data found for Movement Number {mov_num}")

# 调用分析函数
analytics(bigdata)

额外说明

  1. 关于Movement Time的排序:代码里已经实现了提取该列并排序的逻辑,你可以根据需求进一步处理(比如保存到新CSV、计算统计值等)。
  2. 加入了数据校验:确保MovementNumber是数值类型,过滤空值,避免循环时出现异常。
  3. 绘图前检查数据是否为空:防止因某个MovementNumber无对应数据而触发绘图错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:44:08