【问题标题】:How to avoid 'A value is trying to be set on a copy of a slice from a DataFrame'?如何避免“试图在 DataFrame 的切片副本上设置值”?
【发布时间】:2016-07-27 02:35:17
【问题描述】:

我有一个数据框,df_original:

     a     b
0    10    5
1    12    6
2    14    1

现在我想创建一个包含c > 5 的所有行的新数据框,然后在这个新数据框上设置一个新的列值:

df = df_original[df_original['b'] > 5]
df['c'] = df['a'] / df['b']

但我收到警告:

 /Library/Python/2.7/site-packages/ipykernel/__main__.py:25: 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 the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

如果c 没有返回原始数据框,我会非常高兴。但是我应该如何正确地做到这一点并避免警告?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    采取copy 以避免警告:

    In [118]:
    df1 = df[df['b'] > 5].copy()
    df1['c'] = df1['a'] / df1['b']
    df1
    
    Out[118]:
        a  b    c
    1  12  6  2.0
    

    这样可以避免通话中的歧义

    【讨论】:

      【解决方案2】:

      您可以使用assign,它为数据框分配一个新列并返回一个新副本。这是在 0.16.0 版本中添加的:

      >>> df.assign(c = df.a / df.b)
          a  b  c
      1  12  6  2
      

      【讨论】:

        猜你喜欢
        • 2016-09-23
        • 2016-02-17
        • 2016-08-24
        • 2016-06-16
        • 2021-08-09
        • 2018-06-18
        • 2016-12-22
        • 1970-01-01
        • 2017-06-19
        相关资源
        最近更新 更多