値をリセットしない方法を使用して、列全体を別の形式 (つまり、オブジェクトから日時またはオブジェクトから数値) に変換しようとしているデータを処理しています。以下のコードの各行は、'SettingwithCopyWarning' エラーを返します。
#converting euro values column 'value' to numeric values:
df['value'] = pd.to_numeric(df.value, errors='coerce')
#converting object to datetime in order to extract year:
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].dt.year
上記の行のいずれかを残すと、エラーが発生します。それらをすべて取り除いても、コードは警告を発しません。
いくつかの調査の結果、チェーン割り当てが使用されている場合に「SettingwithCopyWarning」が発生し、ビューはデータフレーム自体ではなくデータフレームのコピーであることがわかりました (参照: https://www.dataquest.io/blog/settingwithcopywarning / )。
df.loc[<mask or index label values>, <optional column>] = < new scalar value or array like>
また、連鎖割り当てを回避する一般的な形式は(ref: python pandas: how to avoid chained assignment )であることも学びました。
フォームをテストするためだけに、次のように何かをまとめようとしました。
df.loc[df['value']] = pd.to_numeric(df.value, errors='coerce')
しかし、それは次のようなエラーを返します:
KeyError: "['$3.40m' '$3.90m' '$12.60m' '$13.80m' '$123.80m' '$171.20m'\n '$205.2m' '$214.40m' '$221.03m'] not in index"
これは、私がそれを詰め込もうとした一般的な形式が、辞書と混同して KeyError を発生させていると私に思わせています。
周りを見回した後、チェーン割り当てを使用せずにメソッド (ドット関数) を使用している列全体 (私のコードなど) にこれを適用する方法がわかりません。
これを回避する方法はありますか?
編集:
指定されたコードの上の行:
parent_df = pd.DataFrame.from_records(data, columns = ['date', value'])
df = parent_df[parent_df.date.str.contains('.*201[4-9]')]