【发布时间】: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_1 和 A_2 包含列 A 1 和 2 行之前的值。
但是,我也收到警告:
./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
【问题讨论】: