首页 > 解决方案 > 当我尝试构建 PCA 图时,出现以下错误: ValueError: too many values to unpack (expected 2)

问题描述

我正在尝试构建一个 pca 图并且我编写了这个程序。但由于某种原因,我得到了一张空白图表。我该如何解决这个问题?

import pandas as pd

X = pd.read_csv('ANNCitydata.csv')
# load dataset into Pandas DataFrame
X1 = X.drop(['ID','City'], axis=1)
y = pd.read_csv('ANNCitydata.csv', usecols=["City"])
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(X1)
principalDf = pd.DataFrame(data = principalComponents
             , columns = ['principal component 1', 'principal component 2'])
finalDf = pd.concat([principalDf, y[['City']]], axis = 1)
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = ('Houston', 'St. Louis', 'Waterloo')  
colors = ('r', 'g', 'b')
for data, target, color in zip(finalDf,targets,colors):
    X1, y = data
    ax.scatter(X1, y, alpha=0.8, c=color, edgecolors='none', s=100, label=target)
ax.legend(targets)
ax.grid()
plt.show()

我收到的错误消息

ValueError: too many values to unpack (expected 2)

标签: pythonscikit-learn

解决方案


您的finalDf变量是一个 DataFrame,只有一个,您告诉 python 将其内部值解压缩为两个,x并且y. 所以 python期望看到数据对的迭代(就像你有一个包含三个迭代的元组zip(finalDf,targets,colors)),但它一次只找到一个。

您可以进行健全性检查以查看其中的确切内容data,方法是

print(data)
print(type(data))

在本地(Python 3.6)新创建的 DataFrame 中执行这种循环,我发现一个简单的 for 循环只给了我列名。

for data in df:
    print(data)
# street
# city
# zip
# state
# beds
# baths
# sq__ft
# type
# sale_date
# price
# latitude
# longitude

我可能是错的,但我想你想从列中获取值xy一次一个,在那里。为此,您可以替换finalDffinalDf.itertuples(),这将data成为一个 n 大小的元组,n 是 中的列数finalDf。您将有一个命名元组,因此X1y成为data.xand data.y假设xandy是您的列的名称

for data, target, color in zip(finalDf.itertuples(),targets,colors):
    X1, y = data.x, data.y
    ax.scatter(X1, y, alpha=0.8, c=color, edgecolors='none', s=100, label=target)

推荐阅读