在Pandas数据帧中将默认值设置为整个新列时出错

时间:2016-05-06 19:52:50

标签: python pandas dataframe

但是,在尝试将默认值= 1设置为Pandas数据帧中的整个新列时,代码可以正常运行。这个警告错误是什么意思,我怎么能重做它,所以我没有收到这个警告错误。

df['new']=1

正在尝试在DataFrame的切片副本上设置值。 尝试使用.loc [row_indexer,col_indexer] = value而不是

2 个答案:

答案 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使用[]提供副本。使用lociloc直接访问DataFrame

更重要的是,如果'new'列尚不存在,那么它就会起作用。它只会抛出该错误,因为该列已经存在并且您尝试在视图或副本上编辑它...我想