【问题标题】:Dealing with SettingWithCopyWarning when assigning columns in Pandas [duplicate]在 Pandas 中分配列时处理 SettingWithCopyWarning [重复]
【发布时间】:2017-07-15 07:20:42
【问题描述】:

我有一个DataFrame,我想用包含前一行数据的列来扩展它。

这个脚本完成了这项工作:

#!/usr/bin/env python3

import numpy as np
import pandas as pd

n = 2

df = pd.DataFrame({'A': [1,2,3,4,5], 'B': [0,1,1,0,0]}, columns=['A', 'B'])

df2 = df[df['B'] == 0]
print(df2)

for i in range(1, n+1):
    df2['A_%d' % i] = df2['A'].shift(i)

print(df2)

它输出:

   A  B
0  1  0
3  4  0
4  5  0

   A  B  A_1  A_2
0  1  0  NaN  NaN
3  4  0  1.0  NaN
4  5  0  4.0  1.0

这正是我想要的。 DataFrame 现在有两个额外的列 A_1A_2 包含列 A 12 行之前的值。

但是,我也收到警告:

./my_script.py:14: 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
  df2['A_%d' % i] = df2['A'].shift(i)

问题肯定来自我创建df2 之前的过滤。如果我直接处理df,则不会出现问题。 在我的应用程序中,我需要分别处理原始 DataFrame 的多个部分,因此过滤和绝对是必需的。所有不同的部分(比如这里的df2)稍后会连接起来。

我在How to deal with SettingWithCopyWarning in Pandas?Pandas SettingWithCopyWarning 中发现了类似的问题,但那里的解决方案并不能解决问题。

写作例如

df2[:, 'A_%d' % i] = df2['A'].shift(i)

同样的警告仍然出现。

我正在使用 Python 3.5.2 和 Pandas 0.19.2

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我觉得你需要copy:

    df2 = df[df['B'] == 0].copy()
    

    如果您稍后修改 df2 中的值,您会发现修改不会传播回原始数据 (df),并且 Pandas 会发出警告。

    【讨论】:

    • 它有效。你能解释一下为什么在这种情况下需要调用copy() 吗?特别是因为没有它,代码似乎也能正常工作(除了警告)。
    • 解释对我来说很难。也许更好地解释this
    • 好的,谢谢,我想我现在明白了。
    • 但最好解释一下here
    猜你喜欢
    • 2014-12-30
    • 2020-10-29
    相关资源
    最近更新 更多