Pandas IndexError: DataFrame的索引器不能用于.iloc
我正在尝试使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
