1. ホーム
  2. python

[解決済み] pandasで別の値に基づいてある値を変更する

2022-04-27 16:36:38

質問

StataのコードをPythonで再現しようとしていて、Pandasの方向性を指摘されました。 しかし、どのようにデータを処理するかについて、頭を悩ませています。

IDが特定の数字に一致する場合、対応する2つの値FirstNameとLastNameを変更したいとします。

Stataでは次のようになります。

replace FirstName = "Matt" if ID==103
replace LastName =  "Jones" if ID==103

つまり、これはFirstNameのうち、ID==103の値に対応するすべての値をMattに置き換えます。

Pandasでは、次のようなことを試しています。

df = read_csv("test.csv")
for i in df['ID']:
    if i ==103:
          ...

ここから先がよくわからない。 何かアイデアはありますか?

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

Pythonのスライスとインデックスの機能を使って、条件が成立する場所を論理的に評価し、そこにデータを上書きするのも一つの方法です。

に直接データを読み込むことができると仮定すると、そのデータは pandaspandas.read_csv という場合は、以下のコードが参考になると思います。

import pandas
df = pandas.read_csv("test.csv")
df.loc[df.ID == 103, 'FirstName'] = "Matt"
df.loc[df.ID == 103, 'LastName'] = "Jones"

コメントにあるように、一発で両方の列への割り当てを行うこともできます。

df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'

なお、このとき pandas を使用するには、バージョン 0.11 以降を使用します。 loc を上書き代入操作のために使用します。


もう一つの方法として、連鎖式代入と呼ばれるものを使用する方法もあります。これは動作が安定しないので、最適な解決策とは考えられていません(それは 明示的に推奨されない のドキュメントに記載されています)が、知っておくと便利です。

import pandas
df = pandas.read_csv("test.csv")
df['FirstName'][df.ID == 103] = "Matt"
df['LastName'][df.ID == 103] = "Jones"