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作为循环变量覆盖了,直接删掉即可。
  • 列名存在重复:比如TargetPosZPlayerPosX都重复出现,这会导致后续访问列时出现歧义,建议修正为唯一列名。
  • 你的原始目标是处理第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

火山引擎 最新活动