私はDataFrame
を前の行のデータを含む列で拡張したいと思っています。Pandasで列を割り当てるときのSettingWithCopyWarningを扱う
#!/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
と行の値を前に含む2つの追加の列とA_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)
同じ警告が発生します。
私は私はあなたがcopy
が必要だと思うのPython 3.5.2とパンダ0.19.2時点
これは機能します。この場合、 'copy()'を呼び出す必要がある理由を説明できますか?特にコードはそれがなくてもうまくいくように見えます(警告は別として)。 –
説明が難しいです。たぶんよく説明する[this](http://stackoverflow.com/a/38810015/2901002) – jezrael
ありがとう、私は今理解していると思う。 –