はじめに
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ファイルは目標の通り、
と編集されるようになった。