1. ホーム
  2. python

pandasのデータフレームの列全体に値を設定する

2023-10-18 02:02:25

質問

データフレームの列全体を特定の値に設定しようとしています。

In  [1]: df
Out [1]: 
     issueid   industry
0        001        xxx
1        002        xxx
2        003        xxx
3        004        xxx
4        005        xxx

私が見た限りでは loc はデータフレーム内の値を置き換える際のベストプラクティスです(そうではありませんか?)

In  [2]: df.loc[:,'industry'] = 'yyy'

しかし、それでもこの話題の警告メッセージは表示されました。

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

もし私が

In  [3]: df['industry'] = 'yyy'

同じ警告メッセージが表示されました。

何か思い当たることはありますか? Python 3.5.2、pandas 0.18.1で作業しています。

どのように解決するのですか?

Pythonは、既存のオブジェクトから新しいオブジェクトを定義するときに、予期しないことを行うことができます。あなたは上のコメントで、あなたのデータフレームが次のような行で定義されていると述べました。 df = df_all.loc[df_all['issueid']==specific_id,:] . この場合 df に格納されている行の代用に過ぎません。 df_all オブジェクトに格納されている行の代用に過ぎません。新しいオブジェクトがメモリ上に作成されるわけではありません。

これらの問題を完全に回避するために、私はしばしば自分自身を思い出させるために copy モジュールは、オブジェクトをメモリ内でコピーするように明示的に強制し、新しいオブジェクト上で呼び出されたメソッドがソースオブジェクトに適用されないようにします。私もあなたと同じ問題を抱えており、それを回避するために deepcopy 関数を使用して回避しました。

あなたの場合、これで警告メッセージは解消されるはずです。

from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'


EDIT : 下のDavid M.さんの素晴らしいコメントもご覧ください!

df = df_all.loc[df_all['issueid']==specific_id,:].copy()
df['industry'] = 'yyy'