[Python/pandas]列の値を使って演算をして列に格納する方法
はじめに
pandasのDataFrameで、ある列のデータに対して同じ処理を適用したい、というケースがあります。
いくつかの実現方法があります。
- 直接
- apply
テストデータ
こんなデータを用意します。
df = pd.read_csv('df_test.tsv', sep='\t')
df
# col_str col_int col_float
# A 10 1.5
# B 100 2.5
# C 200 3.5
# D 300 4.5
# G 1000 5.5
1. 直接
値の演算
df[列名] = df[列名] を含む演算
という書き方でいけます。
int
df['col_int'] = df['col_int'] + 1
df['col_int']
# 0 11
# 1 101
# 2 201
# 3 301
# 4 1001
# Name: col_int, dtype: int64
float
df['col_float'] = df['col_float'] /0.5
df['col_float']
# 0 3.0
# 1 5.0
# 2 7.0
# 3 9.0
# 4 11.0
# Name: col_float, dtype: float64
str
df['col_str'] = df['col_str'] + '_add'
df['col_str']
# 0 A_add
# 1 B_add
# 2 C_add
# 3 D_add
# 4 G_add
# Name: col_str, dtype: object
2. apply
applyを使うことで、あらかじめ定義した関数に列の値を引数として渡して、複雑な処理もできます。
# ここまでのデータを確認
df
# col_str col_int col_float
# 0 A_add 11 3.0
# 1 B_add 101 5.0
# 2 C_add 201 7.0
# 3 D_add 301 9.0
# 4 G_add 1001 11.0
一つの列を使って処理
def double_then_minus_5(x):
x *= 2
x -= 5
return x
df['col_int'] = df['col_int'].apply(double_then_minus_5)
df['col_int']
# 0 17
# 1 197
# 2 397
# 3 597
# 4 1997
# Name: col_int, dtype: int64
複数の列を使って処理
df.apply(function, axis=1)
で書けます。
axis=1のつけ忘れに注意。
def double_then_add_string(df):
result = str(df['col_int'] * 2) + "_" + df['col_str']
return result
df['col_combined'] = df.apply(double_then_add_string,axis=1)
df['col_combined']
# 0 34_A_add
# 1 394_B_add
# 2 794_C_add
# 3 1194_D_add
# 4 3994_G_add
# Name: col_combined, dtype: object
まとめ
pandas、使い始めて数ヶ月経過しますが、まだまだできることがたくさんありそうです。
他にも使える機能があれば紹介していきます。
ディスカッション
コメント一覧
まだ、コメントがありません