web-dev-qa-db-ja.com

パンダ:連鎖割り当て

私はこれを読んでいます リンク 「ビューとコピーを返す」について。 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:"
15
Zhubarb

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に設定して(チェーンが発生しているかどうかがわかります)、テストスイート全体で実行されます。

24
Jeff