Pandas
今回はPandasで「The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.」という警告が出た時の対処法を解説します。
とりあえずどんな警告なのか訳してみると、「frame.appendはPandasの将来のバージョンではなくなってしまいます。代わりにpandas.concatを使ってね」ということです。
まぁそうなのかと思い、「append」の代わりに「concat」を使ったら、全然思い通りに行かなくてはまってしまい、結構時間をロスしたので、備忘録ということで今回記事にしようというのが発端です。
「append」はあるデータフレームに1行追加するために使う関数です。
ということでまずは付け足されるデータフレームをこんな感じで作成してみました。
import pandas as pd
import random
row_num = 3
column_num = 6
array = []
for i in range(row_num):
column_vals = [random.randint(0, 10) for _ in range(column_num)]
array.append(column_vals)
column_names = [f'column{i}' for i in range(column_num)]
df = pd.DataFrame(data=array, columns=column_names)
df
実行結果
appendを使った時の警告
それでは「append」でどのような警告が出るのか見てみましょう。
add_data1 = {'column0':0, 'column1':1, 'column2':2, 'column3':3, 'column4':4, 'column5':5}
df1 = df.append(add_data1, ignore_index=True)
df1
実行結果
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_11386/3032846986.py:3:
FutureWarning: The frame.append method is deprecated and will be removed from pandas
in a future version. Use pandas.concat instead.
df1 = df.append(add_data1, ignore_index=True)
というような警告がでます。
ただ現時点ではまだ警告なので、ちゃんと処理はされ、データフレームにデータが追加されています。
ただ将来的には「append」は使えなくなるので、早いうちに対処しておくのがいいでしょう。
appendからconcatへの変更
ということで「append」で行を追加するのではなく、「concat」で行を追加してみましょう。
「concat」で行を追加するには、先ほどの辞書型だったデータをデータフレーム型に変換します。
変換の仕方としては、「pd.DataFrame([‘列名1’:値1, ‘列名2’:値2…])」とします。
そして 「pd.concat([結合されるデータフレーム, 結合するデータフレーム])」で結合します。
add_data2 = pd.DataFrame([{'column0':0, 'column1':1, 'column2':2, 'column3':3, 'column4':4, 'column5':5}])
df2 = pd.concat([df, add_data2])
df2
実行結果
これで追加できました。
インデックスがおかしくなってしまった場合は「reset_index()」でインデックスを付け直すといいでしょう。
df3 = df2.reset_index()
df3
実行結果
失敗その1:データフレーム型に変換しなかった
ここからは私がやった失敗例です。
まず最初にやったのは追加するデータをデータフレーム型に変換せず、そのまま既存のデータフレームに追加しようとしたことでした。
add_data4 = {'column0':0, 'column1':1, 'column2':2, 'column3':3, 'column4':4, 'column5':5}
df4 = pd.concat([df, add_data4])
df4
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [14], in <cell line: 3>()
1 add_data4 = {'column0':0, 'column1':1, 'column2':2, 'column3':3, 'column4':4, 'column5':5}
----> 3 df4 = pd.concat([df, add_data4])
5 df4
(中略)
TypeError: cannot concatenate object of type '<class 'dict'>'; only Series and DataFrame objs are valid
「辞書型はconcatでは結合できません。シリーズかデータフレームしか有効ではありません。」ということで辞書型では直接は結合できませんでした。
失敗その2:Seriesで結合しようとした
先ほどのエラーで「concat」を使うにはシリーズかデータフレームでなければいけないことを学びました。
そして今回追加したいのは1行のデータ。
そうなるとじゃあシリーズに変換して、concatで結合すればいいじゃないかと思い、やってみました。
add_data5 = pd.Series({'column0':0, 'column1':1, 'column2':2, 'column3':3, 'column4':4, 'column5':5})
df5 = pd.concat([df, add_data5])
df5
実行結果
「0」という列ができ、列名として指定した「column0」とかが行名になってしまっています。
ああこれは結合の方向を間違えたなと思い、「concatのオプションにaxis=1」として違う方向に連結してみました。
add_data6 = pd.Series({'column0':0, 'column1':1, 'column2':2, 'column3':3, 'column4':4, 'column5':5})
df6 = pd.concat([df, add_data6], axis=1)
df6
実行結果
「axis=1」を追加しても同じ結果になりました。
さて何故だろう?とここでかなり時間を浪費してしまいました。
その理由としては、シリーズは「列」のデータなのです。
そのためどう連結しようとも新しい列として追加されてしまっていたということです。
ということでデータフレームに行を追加したい場合は、追加したいデータをデータフレームに変換してから「concat」で連結するようにしましょう。
ではでは今回はこんな感じで。
コメント