Pandas IndexError: DataFrame的索引器不能用于.iloc

编程语言 2026-07-10

我正在尝试使用matplotlib绘制实际值与预测值的对比。

以下是我的代码:

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

path = '/content/drive/MyDrive/ML_DATASETS/energy.csv'
data = pd.read_csv(path)

data['timestamp'] = pd.to_datetime(data['timestamp'])

data['time_num'] = range(len(data))

X = data[['time_num', 'temp']]
y = data['load']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

plt.figure(figsize=(15, 5))
plt.scatter(data['timestamp'].iloc[X_test], y_test, s=5,label="Actual")
plt.scatter(data['timestamp'].iloc[X_test], y_pred, s=5, color='red', label="Predicted")
plt.xlabel("Datetime")
plt.ylabel("Load")
plt.title("Energy Load:Actual vs Predicted")
plt.legend()
plt.tight_layout()
plt.show()
Error:
IndexError                                Traceback (most recent call last)
/tmp/ipykernel_8426/3212058888.py in <cell line: 0>()
      1 plt.figure(figsize=(15, 5))
----> 2 plt.scatter(data['timestamp'].iloc[X_test], y_test, s=5, alpha=0.5, label="Actual")
      3 plt.scatter(data['timestamp'].iloc[X_test], y_pred, s=5, alpha=0.5, color='red', label="Predicted")
      4 plt.xlabel("Datetime")
      5 plt.ylabel("Load (MW)")

1 frames
/usr/local/lib/python3.12/dist-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis)
   1721             key = slice(None)
   1722         elif isinstance(key, ABCDataFrame):
-> 1723             raise IndexError(
   1724                 "DataFrame indexer is not allowed for .iloc\n"
   1725                 "Consider using .loc for automatic alignment."

IndexError: DataFrame indexer is not allowed for .iloc
Consider using .loc for automatic alignment.
<Figure size 1500x500 with 0 Axes>

我怀疑问题出在 X_test 的索引上,但我不确定如何修复。

我尝试将 X_test 转换成列表,并使用 .loc 代替 .iloc,但没有作用。

若能得到帮助,将不胜感激!

解决方案

你可能需要 X_test.index

data['timestamp'].iloc[X_test.index]

但使用 .loc 可能更安全,因为 index 有时可能没有数字 0..len(data),而是其他东西——例如 10..len(data)+10 (data.index = range(10, len(data) + 10)),然后 iloc 将在错误的位置进行搜索。

data['timestamp'].loc[X_test.index]

Minimal working code with example data directly in code - so everyone can simply copy and run it.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# path = '/content/drive/MyDrive/ML_DATASETS/energy.csv'
# data = pd.read_csv(path)

import io

text = """timestamp,temp,load
2026.04.01,12,1
2026.04.02,9,0
2026.04.03,15,1
2026.04.04,4,0
2026.04.05,10,1
2026.04.06,10,1
2026.04.07,15,1
2026.04.08,7,0
2026.04.09,5,0
2026.04.10,11,1
"""
data = pd.read_csv(io.StringIO(text))


data["timestamp"] = pd.to_datetime(data["timestamp"])

data["time_num"] = range(10, len(data) + 10)
# data.index = range(10, len(data) + 10)  # to show that `iloc` is wrong idea
print(data)

X = data[["time_num", "temp"]]
y = data["load"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(X_test)

plt.figure(figsize=(15, 5))
plt.scatter(data["timestamp"].loc[X_test.index], y_test, s=5, label="Actual")
plt.scatter(data["timestamp"].loc[X_test.index], y_pred, s=5, color="red", label="Predicted")
plt.xlabel("Datetime")
plt.ylabel("Load")
plt.title("Energy Load:Actual vs Predicted")
plt.legend()
plt.tight_layout()
plt.show()

结果(针对10个值和 test_size=0.4):

在此处输入图片描述

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章