DataFrame の複数列を使う演算を行うためには index が揃っている必要がある

Last updated on

概要

DataFrame で新しい列をつくる時

df['col1_plus_col2'] = df['col1'] + df['col2']

といったような、複数列を使った演算を行うことがある。 このとき index が揃っていないと意図した DataFrame にならない。

バージョン

  • Python: 3.8.13
  • pandas: 1.5.3

ソースコードは GitHub にある。

元となる DataFrame df1, df2 を作る。

df1 = pd.DataFrame({"col1": [i for i in range(5)]})
print(df1.to_markdown())
col1
00
11
22
33
44
df2 = pd.DataFrame({"col2": [i for i in range(5, 10)]})
print(df2.to_markdown())
col2
05
16
27
38
49

df1, df2 を一部切り出す。

df1_sliced = df1.iloc[:2]
print(df1_sliced.to_markdown())
col1
00
11
df2_sliced_simply = df2.loc[3:4]
print(df2_sliced_simply.to_markdown())
col2
38
49

pd.concat([df1_sliced, df2_sliced], axis="columns") を行ってから col1col2 の和である col1_plus_col2 のある下記 DataFrame を作りたい。

col1col2col1_plus_col2
0088
11910

しかし 2 つの DataFrame を連結すると、実際には下記のようになる。

df3_ng = pd.concat([df1_sliced, df2_sliced_simply], axis="columns")
print(df3_ng.to_markdown())
col1col2
00nan
11nan
3nan8
4nan9

この状態で複数列を使った演算を行っても下記のようになる。

df3_ng["col1_plus_col2"] = df3_ng["col1"] + df3_ng["col2"]
print(df3_ng.to_markdown())
col1col2col1_plus_col2
00nannan
11nannan
3nan8nan
4nan9nan

意図した DataFrame を作るためには reset_index() を行う必要がある。

df2_sliced_reset_index = df2.loc[3:4].reset_index(drop=True)
print(df2_sliced_reset_index.to_markdown())
col2
08
19

これを連結すると下記のようになる。

df3_ok = pd.concat([df1_sliced, df2_sliced_reset_index], axis="columns")
print(df3_ok.to_markdown())
col1col2
008
119

ここでできた DataFrame を使って列を追加すると下記のようになる。

df3_ok["col1_plus_col2"] = df3_ok["col1"] + df3_ok["col2"]
print(df3_ok.to_markdown())
col1col2col1_plus_col2
0088
11910

意図した DataFrame を作ることができた。