2017-02-24 3 views
2

私は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時点

答えて

3

で働いています:

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

後であなたは変更が伝播しないことがわかりますdf2で値を変更した場合元のデータ(df)に戻り、Pandasは警告を発します。

+1

これは機能します。この場合、 'copy()'を呼び出す必要がある理由を説明できますか?特にコードはそれがなくてもうまくいくように見えます(警告は別として)。 –

+0

説明が難しいです。たぶんよく説明する[this](http://stackoverflow.com/a/38810015/2901002) – jezrael

+0

ありがとう、私は今理解していると思う。 –

関連する問題