Python:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值
Posted
技术标签:
【中文标题】Python:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值【英文标题】:Python: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 【发布时间】:2016-09-23 11:25:35 【问题描述】:我的熊猫数据框:
dframe = pd.DataFrame("A":list("abcde"), "B":list("aabbc"), "C":[1,2,3,4,5], index=[10,11,12,13,14])
A B C
10 a a 1
11 b a 2
12 c b 3
13 d b 4
14 e c 5
我想要的输出:
A B C a b c
10 a a 1 1 None None
11 b a 2 2 None None
12 c b 3 None 3 None
13 d b 4 None 4 None
14 e c 5 None None 5
想法是根据“B”列中的值创建新列,复制“C”列中的相应值并将它们粘贴到新创建的列中。 这是我的代码:
lis = sorted(list(dframe.B.unique()))
#creating empty columns
for items in lis:
dframe[items] = None
#here copy and pasting
for items in range(0, len(dframe)):
slot = dframe.B.iloc[items]
dframe[slot][items] = dframe.C.iloc[items]
我最终遇到了这个错误:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
app.launch_new_instance()
此代码在 Python 2.7 中运行良好,但在 3.x 中运行不佳。我哪里出错了?
【问题讨论】:
【参考方案1】:开始
to_be_appended = pd.get_dummies(dframe.B).replace(0, np.nan).mul(dframe.C, axis=0)
然后连接
dframe = pd.concat([dframe, to_be_appended], axis=1)
看起来像:
print dframe
A B C a b c
10 a a 1 1.0 NaN NaN
11 b a 2 2.0 NaN NaN
12 c b 3 NaN 3.0 NaN
13 d b 4 NaN 4.0 NaN
14 e c 5 NaN NaN 5.0
搜索注意事项。
这是将一种热编码与广播乘法相结合。
【讨论】:
非常简单!任何想法得到 None 而不是 0?【参考方案2】:Chained assignment will now by default warn if the user is assigning to a copy.
这可以通过选项 mode.chained_assignment 进行更改,允许的选项是 raise/warn/None。请参阅文档。
在[5]中:dfc = DataFrame('A':['aaa','bbb','ccc'],'B':[1,2,3])
在[6]中:pd.set_option('chained_assignment','warn')
如果尝试这样做,将显示以下警告/异常。
在 [7] 中:dfc.loc[0]['A'] = 1111
Traceback(最近一次调用最后一次) ... SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_index,col_indexer] = value 这是正确的赋值方法。
在[8]中:dfc.loc[0,'A'] = 11
在[9]中:dfc
A B
0 11 1
1 bbb 2
2 cc 3
【讨论】:
以上是关于Python:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值的主要内容,如果未能解决你的问题,请参考以下文章