[Python/pandas]列の値を使って演算をして列に格納する方法

2020年5月25日

はじめに

pandasのDataFrameで、ある列のデータに対して同じ処理を適用したい、というケースがあります。

いくつかの実現方法があります。

  1. 直接
  2. 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、使い始めて数ヶ月経過しますが、まだまだできることがたくさんありそうです。
他にも使える機能があれば紹介していきます。