但是,在尝试将默认值= 1设置为Pandas数据帧中的整个新列时,代码可以正常运行。这个警告错误是什么意思,我怎么能重做它,所以我没有收到这个警告错误。
df['new']=1
正在尝试在DataFrame的切片副本上设置值。 尝试使用.loc [row_indexer,col_indexer] = value而不是
答案 0 :(得分:1)
这应该可以解决问题:
soldactive = df[(df.DispositionStatus == 'Sold') & (df.AssetStatus == 'Active')].copy()
您的代码:
removesold = df(df.ExitDate.isin(errorval)) & (df.DispositionStatus == 'Sold') & (af.AssetStatus == 'Resolved')]
df = df.drop(removesold.index)
soldactive = df[(df.DispositionStatus == 'Sold') & (df.AssetStatus == 'Active')]
soldactive['FlagError'] = 1
您已创建soldactive
DF作为子集的副本(切片)df
。
之后,您正在尝试在该副本上创建新列。它会给你一个警告:A value is trying to be set on a copy of a slice from a DataFrame
因为数据帧是值可变的(参见下面文档的摘录)
文档:
所有pandas数据结构都是值可变的(它们包含的值) 可以改变)但不总是大小可变的。系列的长度 无法更改,但是,例如,列可以插入到 数据帧。但是,绝大多数方法都会产生新的对象 并保持输入数据不变。但总的来说,我们喜欢 在合情合理的情况下支持不变性。
这是一个测试用例:
In [375]: df
Out[375]:
a b c
0 9 6 4
1 5 2 8
2 8 1 6
3 3 4 1
4 8 0 2
In [376]: a = df[1:3]
In [377]: a['new'] = 1
C:\envs\py35\Scripts\ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
In [378]: del a
In [379]: a = df[1:3].copy()
In [380]: a['new'] = 1
In [381]: a
Out[381]:
a b c new
1 5 2 8 1
2 8 1 6 1
In [382]: df
Out[382]:
a b c
0 9 6 4
1 5 2 8
2 8 1 6
3 3 4 1
4 8 0 2
答案 1 :(得分:0)
df.loc[:, 'new'] = 1
pandas
使用[]
提供副本。使用loc
和iloc
直接访问DataFrame
。
更重要的是,如果'new'
列尚不存在,那么它就会起作用。它只会抛出该错误,因为该列已经存在并且您尝试在视图或副本上编辑它...我想