【问题标题】:Error when setting default value to entire new column in Pandas dataframe在 Pandas 数据框中将默认值设置为整个新列时出错
【发布时间】:2016-09-01 23:59:31
【问题描述】:

代码可以正常工作,但是在尝试将默认值 =1 设置为 Pandas 数据框中的整个新列时出现此错误。这个警告错误是什么意思,我该如何修改它,这样我就不会收到这个警告错误了。

df['new']=1

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

【问题讨论】:

  • 你是如何创建你的df的?
  • @MaxU 原始数据框从使用 df.read_sql_query 的 SQL 查询创建。然后我用多种操作格式化 df。
  • 你能解释一下formatting df with a multitude of operations吗?
  • @MaxU 在这里,我正在制作原始 df 的两份副本(removesold 和 soldactive)。当我尝试为 removesold 创建新列时,我没有收到任何错误,但对于 soldactive,我收到警告错误
    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

标签: python pandas dataframe


【解决方案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

【讨论】:

    【解决方案2】:

    解决方案

    df.loc[:, 'new'] = 1
    

    pandas 使用[] 提供副本。使用lociloc 直接访问DataFrame

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

    【讨论】:

    • 仍然收到警告错误 df.loc[:,'new']=1 试图在数据帧的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value 查看文档中的警告:pandas.pydata.org/pandas-docs/stable/… self.obj[item] = s
    • 这对我来说没有问题。你用的是什么版本的熊猫?
    • 副本是在df['new'] = 1 之前的某个地方制作的,因为它本身不会产生副本。
    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 2013-07-11
    • 2020-02-17
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多