元の質問は、特定の狭い使用例を扱っています。より一般的な答えが必要な人のためにここにいくつかの例があります:
他の列のデータを使用して新しい列を作成する
以下のデータフレームがあるとします:
import pandas as pd
import numpy as np
df = pd.DataFrame([['dog', 'hound', 5],
['cat', 'ragdoll', 1]],
columns=['animal', 'type', 'age'])
In[1]:
Out[1]:
animal type age
----------------------
0 dog hound 5
1 cat ragdoll 1
以下では、シリーズに対してオーバーライドされる操作をdescription使用して、新しい列を他の列の連結として追加しています+。は文字列に+適用され、「プリミティブ」値には適用されないため、派手な文字列フォーマット、f文字列などはここでは機能しません。
df['description'] = 'A ' + df.age.astype(str) + ' years old ' \
+ df.type + ' ' + df.animal
In [2]: df
Out[2]:
animal type age description
-------------------------------------------------
0 dog hound 5 A 5 years old hound dog
1 cat ragdoll 1 A 1 years old ragdoll cat
1 years(の代わりに1 year)猫を取得します。これは、条件文を使用して以下で修正します。
条件付きで既存の列を変更する
ここでは、元のanimal列を他の列の値で置き換え、np.whereの値に基づいて条件付き部分文字列を設定するために使用していますage。
# append 's' to 'age' if it's greater than 1
df.animal = df.animal + ", " + df.type + ", " + \
df.age.astype(str) + " year" + np.where(df.age > 1, 's', '')
In [3]: df
Out[3]:
animal type age
-------------------------------------
0 dog, hound, 5 years hound 5
1 cat, ragdoll, 1 year ragdoll 1
条件付きで複数の列を変更する
より柔軟なアプローチは.apply()、単一の列ではなくデータフレーム全体を呼び出すことです。
def transform_row(r):
r.animal = 'wild ' + r.type
r.type = r.animal + ' creature'
r.age = "{} year{}".format(r.age, r.age > 1 and 's' or '')
return r
df.apply(transform_row, axis=1)
In[4]:
Out[4]:
animal type age
----------------------------------------
0 wild hound dog creature 5 years
1 wild ragdoll cat creature 1 year
上記のコードでは、transform_row(r)関数はSeries指定された行を表すオブジェクトを受け取ります(で示されaxis=1、のデフォルト値は各列にオブジェクトをaxis=0提供しSeriesます)。これにより、列名を使用して行の実際の「プリミティブ」値にアクセスし、特定の行/列の他のセルを表示できるため、処理が簡略化されます。
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'