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]
- 语法错误导致列名失效:
data['MovementNumber'.]里多了个多余的句号,Python会把'MovementNumber'.当成带句号的字符串去匹配列名,完全偏离了你要访问的MovementNumber列。 - 行过滤逻辑完全错误:
['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)
额外说明
- 关于
Movement Time的排序:代码里已经实现了提取该列并排序的逻辑,你可以根据需求进一步处理(比如保存到新CSV、计算统计值等)。 - 加入了数据校验:确保
MovementNumber是数值类型,过滤空值,避免循环时出现异常。 - 绘图前检查数据是否为空:防止因某个
MovementNumber无对应数据而触发绘图错误。
内容的提问来源于stack exchange,提问作者PeruvianNaplord




