問題解決:SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a Data Frame
4745 ワード
SettingWithCopyWarningソリューション
問題シーン:csvファイルを読み込んだ後、フィーチャー列を追加し、既存のフィーチャーに基づいて新しい列の値を変更するため、変更時にSettingWithCopyWarningという警告に遭遇し、この問題を解決するのに長い時間がかかりました.
簡易版の例
出力:
新しいカラムを追加して出力
条件に従って新しい列を修正して出力するとエラーが発生します.
この問題はどのように解決しますか?stackoverflowの多くの投稿を調べて、loc/ilocなどの関数を試しても役に立たないで、最後にやっと順序が間違っていることに気づきました.正しいシナリオは、正しい配列を生成してdataframeに挿入することです.次に、上記の例を正しい方法で再生成します.
OKです.もしあなたも似たような問題があったら、私の方法で解決してもいいです.
問題シーン:csvファイルを読み込んだ後、フィーチャー列を追加し、既存のフィーチャーに基づいて新しい列の値を変更するため、変更時にSettingWithCopyWarningという警告に遭遇し、この問題を解決するのに長い時間がかかりました.
簡易版の例
import pandas as pd
import numpy as np
aa = np.array([1, 0, 1, 0])
bb = pd.DataFrame(aa.T, columns=['one'])
print(bb)
出力:
one
0 1
1 0
2 1
3 0
新しいカラムを追加して出力
bb['two'] = 0
print(bb)
output[]:
one two
0 1 0
1 0 0
2 1 0
3 0 0
条件に従って新しい列を修正して出力するとエラーが発生します.
for i in range(bb.shape[0]):
if bb['one'][i] == 0:
bb['two'][i] = 1
print(bb)
output[]:
C:/PycharmProjects/NaiveBayesProduct/pandas/try_index.py:22: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
bb['two'][i] = 1
one two
0 1 0
1 0 1
2 1 0
3 0 1
この問題はどのように解決しますか?stackoverflowの多くの投稿を調べて、loc/ilocなどの関数を試しても役に立たないで、最後にやっと順序が間違っていることに気づきました.正しいシナリオは、正しい配列を生成してdataframeに挿入することです.次に、上記の例を正しい方法で再生成します.
import pandas as pd
import numpy as np
aa = np.array([1, 0, 1, 0])
bb = pd.DataFrame(aa.T, columns=['one'])
# ndarray,
two = np.zeros(bb.shape[0])
# two
for i in range(bb.shape[0]):
if bb['one'][i] == 0:
two[i] = 1
# two dataframe
bb.insert(1,'two', two)
print(bb)
output[]:
one two
0 1 0.0
1 0 1.0
2 1 0.0
3 0 1.0
OKです.もしあなたも似たような問題があったら、私の方法で解決してもいいです.