熊猫尝试改用 .loc[row_indexer,col_indexer] = value

Posted

技术标签:

【中文标题】熊猫尝试改用 .loc[row_indexer,col_indexer] = value【英文标题】:Pandas Try using .loc[row_indexer,col_indexer] = value instead 【发布时间】:2018-12-22 23:14:46 【问题描述】:

这是我的例子

data = 'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
         'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
         'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
         'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
         'Points':[876,789,863,673,741,812,756,788,694,701,804,690]
data = pd.DataFrame(data)
data.head()

当我这样做时,我从 pandas 库收到警告

from sklearn.model_selection import train_test_split
train_new, val_new = train_test_split(data, test_size=0.2)

col = 'Team'
means = data.groupby(col)['Points'].mean()
train_new[col + '_mean_target'] = train_new[col].map(means)
train_new.head()

这是警告

SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_indexer,col_indexer] = value

当我使用 .loc 时

col = 'Team'
means = data.groupby(col)['Points'].mean()
train_new.loc[:,col + '_mean_target'] = train_new.loc[:,col].map(means)
train_new.head()

它显示了完全相同的警告,那么代码有什么问题?

【问题讨论】:

我很困惑,您发布的数据没有对齐。它甚至在语法上都不正确。什么意思? 语法上是正确的,但也许我应该发布一个更小的例子。 我发誓我在使用几乎与您完全相同的代码之前遇到了这个问题,所以我通常只是忽略它。我目前正在寻找解决方案,因为我厌倦了看到它。如果我发现任何有用的东西,我会报告。 【参考方案1】:

另一种方法是禁用链式分配,它适用于您的代码无需创建副本:

# disable chained assignments
pd.options.mode.chained_assignment = None

这是这个相关问题的答案(不会说这是一个重复的问题)-Pandas DataFrame: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

【讨论】:

以上是关于熊猫尝试改用 .loc[row_indexer,col_indexer] = value的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框列计算

尝试 .loc 后的熊猫 SettingWithCopyWarning

试图在 DataFrame 中的切片副本上设置一个值

KeyError:在熊猫中尝试使用.loc方法将布尔列值更改为字符串时

Python 视图与复制错误希望我仅在脚本中使用 .loc

Python:熊猫系列 - 为啥使用 loc?