概要
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 | |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
df2 = pd.DataFrame({"col2": [i for i in range(5, 10)]})
print(df2.to_markdown())
| col2 | |
|---|---|
| 0 | 5 |
| 1 | 6 |
| 2 | 7 |
| 3 | 8 |
| 4 | 9 |
df1, df2 を一部切り出す。
df1_sliced = df1.iloc[:2]
print(df1_sliced.to_markdown())
| col1 | |
|---|---|
| 0 | 0 |
| 1 | 1 |
df2_sliced_simply = df2.loc[3:4]
print(df2_sliced_simply.to_markdown())
| col2 | |
|---|---|
| 3 | 8 |
| 4 | 9 |
pd.concat([df1_sliced, df2_sliced], axis="columns") を行ってから col1 と col2 の和である col1_plus_col2 のある下記 DataFrame を作りたい。
| col1 | col2 | col1_plus_col2 | |
|---|---|---|---|
| 0 | 0 | 8 | 8 |
| 1 | 1 | 9 | 10 |
しかし 2 つの DataFrame を連結すると、実際には下記のようになる。
df3_ng = pd.concat([df1_sliced, df2_sliced_simply], axis="columns")
print(df3_ng.to_markdown())
| col1 | col2 | |
|---|---|---|
| 0 | 0 | nan |
| 1 | 1 | nan |
| 3 | nan | 8 |
| 4 | nan | 9 |
この状態で複数列を使った演算を行っても下記のようになる。
df3_ng["col1_plus_col2"] = df3_ng["col1"] + df3_ng["col2"]
print(df3_ng.to_markdown())
| col1 | col2 | col1_plus_col2 | |
|---|---|---|---|
| 0 | 0 | nan | nan |
| 1 | 1 | nan | nan |
| 3 | nan | 8 | nan |
| 4 | nan | 9 | nan |
意図した DataFrame を作るためには reset_index() を行う必要がある。
df2_sliced_reset_index = df2.loc[3:4].reset_index(drop=True)
print(df2_sliced_reset_index.to_markdown())
| col2 | |
|---|---|
| 0 | 8 |
| 1 | 9 |
これを連結すると下記のようになる。
df3_ok = pd.concat([df1_sliced, df2_sliced_reset_index], axis="columns")
print(df3_ok.to_markdown())
| col1 | col2 | |
|---|---|---|
| 0 | 0 | 8 |
| 1 | 1 | 9 |
ここでできた DataFrame を使って列を追加すると下記のようになる。
df3_ok["col1_plus_col2"] = df3_ok["col1"] + df3_ok["col2"]
print(df3_ok.to_markdown())
| col1 | col2 | col1_plus_col2 | |
|---|---|---|---|
| 0 | 0 | 8 | 8 |
| 1 | 1 | 9 | 10 |
意図した DataFrame を作ることができた。