LoginSignup
1
2

More than 3 years have passed since last update.

pandas の SettingWithCopyWarning

Last updated at Posted at 2020-03-01

はじめに

pandasを使ってcsvファイルを操作するアプリをつくっていたら、
結果は思った通りに編集されるのだが、
SettingWithCopyWarningと警告された。

SettingWithCopyWarning

参照渡し(っていうの?)であるがゆえの警告的なものっぽいっと思っています。
元のデータの一部を抽出→そのうち一部へ代入した場合、
「元のデータのその部分」を修正したかったのか、
「一部を変更した新しいデータ」を作りたかったのかどっちかわからないよ、という感じ?

お気軽にコメントにてご鞭撻下さい。

解決

copy()で、参照ではなくコピーであることを明示したら、
SettingWithCopyWarningは解消されました。

好きな果物をcsvファイルにまとめるアプリ

まず、
output_filesというディレクトリ(フォルダ)に
data.csvという名前のcsvファイルをつくる。

中身は
apple,8
orange,15
banana,4
apple,1
となっている。

data.csv
apple,8
orange,15
banana,4
apple,1

このcsvファイルを
apple,1を削除し、
apple,9に書き換え

data.csv
apple,9
orange,15
banana,4

と編集する事を目標とする。

check_data.py
import pandas as pd

def check():
    df = pd.read_csv('output_files/data.csv', names=['fru_name', 'count'])
    #vcに最頻出(重複している)の果物を格納
    vc = df['fru_name'].value_counts().index[0]
    # freに出現回数を格納
    fre = df['fru_name'].value_counts().iat[0]

    if fre > 1:
        # 重複しているの果物の行を削除し、それを変数new_dataに格納
        new_data = df.drop_duplicates(subset='fru_name')

        # 重複しているの果物の元の数をdup_countに格納
        dup_count = int(new_data.loc[new_data['fru_name'] == vc, 'count'])
        # dup_countを+1する
        dup_count += 1
        new_data.loc[new_data['fru_name'] == vc, 'count'] = dup_count

        #data.csvに上書き
        new_data.to_csv('output_files/data.csv', index=False, header=False)

check()
check_data.pyの実行結果
SettingWithCopyWarning

csvファイルは目標の通り、

data.csv
apple,9
orange,15
banana,4

と編集されたが、
SettingWithCopyWarningが出た。

改善

copy()で、参照ではなくコピーであることを明示する為、

new_data = df.drop_duplicates(subset='fru_name')

#copy()で、参照ではなくコピーであることを明示
new_data = df.drop_duplicates(subset='fru_name').copy()

に変更。

check_data2.py
import pandas as pd

def check():
    df = pd.read_csv('output_files/data.csv', names=['fru_name', 'count'])
    #vcに最頻出(重複している)の果物を格納
    vc = df['fru_name'].value_counts().index[0]
    # freに出現回数を格納
    fre = df['fru_name'].value_counts().iat[0]

    if fre > 1:
        # 重複しているの果物の行を削除し、それを変数new_dataに格納
        new_data = df.drop_duplicates(subset='fru_name').copy()

        # 重複しているの果物の元の数をdup_countに格納
        dup_count = int(new_data.loc[new_data['fru_name'] == vc, 'count'])
        # dup_countを+1する
        dup_count += 1
        new_data.loc[new_data['fru_name'] == vc, 'count'] = dup_count

        #data.csvに上書き
        new_data.to_csv('output_files/data.csv', index=False, header=False)

check()

これで、
SettingWithCopyWarningが出ずに、
csvファイルは目標の通り、
と編集されるようになった。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2