column が一致するすべての行に新しい値を伝播しても問題ないと仮定するとa
( column に重複があった場合a
)、次のようになります。
for a_val, b_val in d.iteritems():
df['b'][df.a==a_val] = b_val
または代入操作の連鎖を避けるには:
for a_val, b_val in d.iteritems():
df.loc[df.a==a_val, 'b'] = b_val
loc
使用するには、Pandas 0.11 以降で作業している必要があることに注意してください。.ix
古いバージョンでは、連鎖割り当てを防ぐために使用できる場合があります。
@Jeff は、このコメントで既に言及した現象について説明しているこのリンクを指摘しました。アクセスの順序を逆にすると予測可能な効果があるため、これは正確性の問題ではないことに注意してください。これは、たとえば以下で簡単に確認できます。
In [102]: id(df[df.a==5]['b'])
Out[102]: 113795992
In [103]: id(df['b'][df.a==5])
Out[103]: 113725760
最初に列を取得してから、インデックスに基づいてその列に割り当てると、変更がその列に影響します。また、列は DataFrame の一部であるため、変更は DataFrame に影響します。最初に一連の行にインデックスを付けると、同じ DataFrame について話していることにはならないため、フィルター処理されたオブジェクトから列を取得しても、元の列は表示されません。
@Jeffは、これが「正しくない」ことを示唆していますが、私の見解では、これは明白で予想される動作です。混合データ型の列があり、Pandas が列に値を書き込むのを妨げる型の昇格/降格が行われている特別なケースでは、これに正確性の問題が発生する可能性があります。しかし、Pandas 0.11 まで利用できないことを考えると、おそらく正しい選択である可能性がある唯一のものであるloc
ようなふりをするのではなく、連鎖代入でそれを行う方法を指摘することはまだ公平だと思います。loc
それが「正しくない」と考えるより明確な理由を誰かが提供できる場合は (スタイル的にこれを好まないのではなく)、貢献してください。