运行后出现TypeError: unhashable type: 'numpy.ndarray',修改并给我完整代码
时间: 2024-12-20 14:29:32 浏览: 6
根据您提供的代码和错误信息 `TypeError: unhashable type: 'numpy.ndarray'`,这个错误通常发生在尝试将不可哈希的对象(如列表或数组)作为字典的键使用时。在您的代码中,可能是因为某些列的数据类型不正确导致的问题。
为了修复这个问题,我们需要检查并确保所有的键都是可哈希的。以下是修正后的完整代码:
```python
import os
import pandas as pd
import matplotlib.pyplot as plt
# 指定文件夹路径
folder_path = r"D:\dummycsv"
# 获取文件夹中的所有CSV文件
csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
# 存储每个CSV文件的数据框
dataframes = {}
# 读取所有CSV文件
for file in csv_files:
file_path = os.path.join(folder_path, file)
df = pd.read_csv(file_path)
dataframes[file] = df
# 示例:生成一些基本的可视化图表
# 假设我们有一些常见的字段来进行可视化
# 用户登录日志
if 'login_log.csv' in dataframes:
login_log_df = dataframes['login_log.csv']
plt.figure(figsize=(10, 6))
plt.plot(login_log_df['timestamp'], login_log_df['watching'], label='Watching')
plt.plot(login_log_df['timestamp'], login_log_df['downloading'], label='Downloading')
plt.xlabel('Timestamp')
plt.ylabel('Activity')
plt.title('User Activity Over Time')
plt.legend()
plt.show()
# 用户评分数据
if 'watch_m.csv' in dataframes and 'watch_s.csv' in dataframes:
watch_m_df = dataframes['watch_m.csv']
watch_s_df = dataframes['watch_s.csv']
# 合并电影和剧集评分
ratings_df = pd.concat([
watch_m_df[['email', 'rate']].rename(columns={'rate': 'movie_rate'}),
watch_s_df[['email', 'rate']].rename(columns={'rate': 'series_rate'})
], axis=1)
# 确保 email 列没有重复值
ratings_df = ratings_df.drop_duplicates(subset=['email'])
plt.figure(figsize=(10, 6))
plt.scatter(ratings_df['email'], ratings_df['movie_rate'], label='Movies')
plt.scatter(ratings_df['email'], ratings_df['series_rate'], label='Series')
plt.xlabel('Email')
plt.ylabel('Rating')
plt.title('User Ratings for Movies and Series')
plt.xticks(rotation=45)
plt.legend()
plt.show()
# 游戏下载数据
if 'download.csv' in dataframes:
download_df = dataframes['download.csv']
game_download_counts = download_df['game_id'].value_counts()
plt.figure(figsize=(10, 6))
game_download_counts.plot(kind='bar')
plt.xlabel('Game ID')
plt.ylabel('Download Count')
plt.title('Game Download Counts')
plt.show()
# 车辆拥有情况
if 'own_c.csv' in dataframes:
own_c_df = dataframes['own_c.csv']
car_quality_by_user = own_c_df.groupby('email')['quality'].mean()
plt.figure(figsize=(10, 6))
car_quality_by_user.plot(kind='bar')
plt.xlabel('Email')
plt.ylabel('Average Car Quality')
plt.title('Average Car Quality by User')
plt.xticks(rotation=45)
plt.show()
# 武器拥有情况
if 'own_w.csv' in dataframes:
own_w_df = dataframes['own_w.csv']
weapon_quality_by_user = own_w_df.groupby('email')['quality'].mean()
plt.figure(figsize=(10, 6))
weapon_quality_by_user.plot(kind='bar')
plt.xlabel('Email')
plt.ylabel('Average Weapon Quality')
plt.title('Average Weapon Quality by User')
plt.xticks(rotation=45)
plt.show()
# 可用语言分布
if 'avail_language.csv' in dataframes:
avail_language_df = dataframes['avail_language.csv']
language_counts = avail_language_df['language'].value_counts()
plt.figure(figsize=(10, 6))
language_counts.plot(kind='pie', autopct='%1.1f%%')
plt.title('Available Languages Distribution')
plt.ylabel('')
plt.show()
```
### 关键修改点:
1. **去重处理**:在合并电影和剧集评分数据时,添加了 `drop_duplicates` 方法来确保 `email` 列没有重复值,从而避免因重复值引起的哈希冲突。
2. **确保键的唯一性**:在合并数据时,确保每个用户的 `email` 是唯一的,这样可以避免 `TypeError`。
希望这些修改能解决您的问题。如果有其他错误或需要进一步的帮助,请随时告知。
阅读全文