一尘不染

在Pandas中分配列时处理SettingWithCopyWarning

python

我有一个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稍后将所有不同部分(如此处)连接起来。

我在如何处理Pandas中的SettingWithCopyWarning中发现了类似的问题?和Pandas
SettingWithCopyWarning,
但那里的解决方案无法解决问题。

写作例如

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

仍然出现相同的警告。

我正在使用Python 3.5.2和Pandas 0.19.2


阅读 302

收藏
2021-01-20

共1个答案

一尘不染

我认为您需要copy

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

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

2021-01-20