2017-12-22 4 views
2

マルチインデックスデータフレームに値を設定しようとしています。私は.locを使用していますが、私はまだSettingsWithCopyWarningを取得しています。私はドキュメントを読んだが、私はこれをどうやってやるべきかわからない。私は間違って何をしていますか?マルチインデックスPandasデータフレームで値を設定する正しい方法

「SettingWithCopyWarning: 値はデータフレームからのスライスのコピーに設定されるようにしようとしている が.LOCを使用してみてください[row_indexer、col_indexer] =値の代わりに

は、ドキュメントの注意事項を参照してください。http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self.obj [アイテム] = sの」

arrays = [np.array(['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D']), 
     np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'])] 

df = pd.DataFrame(np.random.randn(6, 8), columns=arrays) 

mask = df.loc[:,('A','one')].ge(0) 
df[mask].loc[:,('B')] = "A" 
+1

マスクを '.loc'内に適用します。 'df.loc [mask、( 'B')] =" A "'のように – Craig

答えて

4

あなたがデータフレームのサブセットに.loc[]を行っているので、SettingWithCopyWarningが発生しました。 .loc[]を使用してサブセットを直接選択すると、このエラーは発生しません。

arrays = [np.array(['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D']), 
     np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'])] 

df = pd.DataFrame(np.random.randn(6, 8), columns=arrays) 

mask = df.loc[:,('A','one')].ge(0) 
df.loc[mask,('B')] = "A" 

あなたはこのため.loc[]を必要としないため、また、あなたはマスクを計算するラインを簡素化することができます。

mask = df[('A','one')].ge(0)  # or, df[('A','one')] >= 0 
関連する問題