0

データフレームの特定のしきい値内で値を変更するコードを実行しています。表面的には保証されていないように見えるという警告を受け取りました。

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

私のコードは既に a.loc[row,column]割り当てを使用しているため、警告がそれを示唆する理由がわかりません。

import pandas as pd
#pd.options.mode.chained_assignment = None #disable warning 
#pd.set_option('mode.chained_assignment','warn')#or "warn" or "raise"
u = (df 
# Group all forecasts together
     .groupby(by="forecast_id",  sort=False)
# modify only forecasts groups that have smallest value = 0 
     .filter(lambda x: x.value.min() == 0, dropna=False)
# transform values according to a function
     .value.transform( lambda x: (x+0.005).where(x == 0, x-0.005) ) 
     )
# replace the column in the dataframe with the new values except those unaffected
df.loc[pd.notnull(u), "value"] = u

私が説明できなかった他の動作は、警告オプションをいじっていたときに、一度警告を に設定するとNone、設定を に戻して"warn"も警告が表示されなくなることです。注:私のコードは関数として使用されています。


編集

コードの機能の説明と例は、上部のリンクに記載されています。ただし、ここでの焦点は、警告が既に実装されている実装を示唆している理由を理解することです:パンダ - 別の列との相互参照に基づいて新しい値を計算する

4

0 に答える 0