AttributeError: 'tuple' object has no attribute 'drop'

出现
AttributeError: 'tuple' object has no attribute 'drop'


for category in categories:
    train_data: tuple[Any] = sales_data_train[sales_data_train['分类名称'] == category],
    test_data = sales_data_test[sales_data_test['分类名称'] == category]

    X_train = train_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)
    y_train = train_data['销量(千克)']
    X_test = test_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)
    y_test = test_data['销量(千克)']

出现
AttributeError: 'tuple' object has no attribute 'drop'

问题出在这行代码:

train_data: tuple[Any] = sales_data_train[sales_data_train['分类名称'] == category],

你在这行末尾加了一个逗号,导致 train_data 成为一个元组,而不是你期望的 DataFrame

解决方案是删除该逗号,代码如下:

for category in categories:
    train_data: Any = sales_data_train[sales_data_train['分类名称'] == category]
    test_data = sales_data_test[sales_data_test['分类名称'] == category]
 
    X_train = train_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)
    y_train = train_data['销量(千克)']
    X_test = test_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)
    y_test = test_data['销量(千克)']

这样,train_data 应该是一个 DataFrame 对象,具有 drop 方法

【以下回答由 GPT 生成】

问题分析: 在上述代码中,错误发生在X_train = train_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)这行代码上。错误提示为:AttributeError: 'tuple' object has no attribute 'drop'。

问题解决: 该错误的原因是我们将train_data定义为一个元组(tuple),而元组没有drop方法。解决这个问题的方法是将train_data定义为一个数据框(DataFrame)。

以下是修改后的代码:

import pandas as pd

# 将train_data定义为DataFrame而不是元组
train_data = sales_data_train.loc[sales_data_train['分类名称'] == category].copy()
test_data = sales_data_test.loc[sales_data_test['分类名称'] == category].copy()

X_train = train_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)
y_train = train_data['销量(千克)']
X_test = test_data.drop(['销售日期', '销量(千克)', '分类名称'], axis=1)
y_test = test_data['销量(千克)']

请注意,我在代码开头添加了import pandas as pd语句,这是为了使用pandas库中的DataFrame和其他相关方法。

此外,为了解决数据引用导致的问题,我还添加了.copy()方法来确保train_datatest_data是独立的副本,而不是对原始数据的引用。

希望这个解决方案可以解决你的问题。如果你还有任何疑问,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^