私はこれを読んでいます リンク 「ビューとコピーを返す」について。 Pandasの連鎖代入の概念がどのように機能し、.ix()
、.iloc()
、または.loc()
が影響します。
次のコード行に対してSettingWithCopyWarning
警告が表示されます。ここで、data
はPandaデータフレームであり、amount
はそのデータフレームの列(シリーズ)名です。
data['amount'] = data['amount'].astype(float)
data["amount"].fillna(data.groupby("num")["amount"].transform("mean"), inplace=True)
data["amount"].fillna(mean_avg, inplace=True)
このコードを見ると、私が次善のことをしていることは明らかですか?もしそうなら、交換用のコード行を教えていただけますか?
私は以下の警告を認識しており、私の場合の警告は誤検知であると考えたいと思います。
連鎖割り当ての警告/例外は、無効な可能性のある割り当てをユーザーに通知することを目的としています。誤検知がある可能性があります。連鎖割り当てが誤って報告される状況。
EDIT:最初のコピー警告エラーにつながるコード。
data['amount'] = data.apply(lambda row: function1(row,date,qty), axis=1)
data['amount'] = data['amount'].astype(float)
def function1(row,date,qty):
try:
if(row['currency'] == 'A'):
result = row[qty]
else:
rate = lookup[lookup['Date']==row[date]][row['currency'] ]
result = float(rate) * float(row[qty])
return result
except ValueError: # generic exception clause
print "The current row causes an exception:"
SettingWithCopy
のポイントは、元のデータフレームを期待どおりに更新しないことをしていることをユーザーに警告することですmay。
ここで、data
は、おそらく単一のdtypeの(またはそうでない)データフレームです。次に、シリーズであるこのdata['amount']
を参照して、更新します。これはおそらく、既存と同じdtypeのデータを返すために機能します。
ただし、coulddata['amount']
のコピーを更新するコピーを作成します。これは表示されません。次に、なぜそれが更新されないのか疑問に思うでしょう。
Pandasは、ほとんどすべてのメソッド呼び出しでオブジェクトのコピーを返します。 inplace
操作は機能する便利な操作ですが、一般に、データが変更されており、コピーで機能する可能性があることは明らかではありません。
これを行うには、はるかに明確です。
data['amount'] = data["amount"].fillna(data.groupby("num")["amount"].transform("mean"))
data["amount"] = data['amount'].fillna(mean_avg)
コピーに取り組むことへのもう1つのプラス。操作を連鎖させることができますが、これはinplace
のものでは不可能です。
例えば.
data['amount'] = data['amount'].fillna(mean_avg)*2
そして、参考までに。 inplace
操作は、高速でもメモリ効率も高くありません。 my2cは禁止する必要があります。しかし、そのAPIでは遅すぎます。
もちろん、これをオフにすることもできます。
pd.set_option('chained_assignment',None)
Pandasは、FYIで、これをraise
に設定して(チェーンが発生しているかどうかがわかります)、テストスイート全体で実行されます。