エラー発生
道路ネットワークのデータを使う際にリンクのIDとその両端のノードのIDをつかって新しいキーを作ろうとしたが、雰囲気で結合させてみたらエラー。
やったこと
- DataFrameの数字の項目列を連結させて新しいKey列を作ろうとした
df_route_link["key"] = df_route_link["objectid"] + "_" + df_route_link["from_node_id"] + "_" + df_route_link["to_node_id"]
こんな感じ。でもエラー。
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U11') dtype('<U11') dtype('<U11')
そもそも数字を文字列は単純に結合できないので、DataFrameでもできないだろうなという気はしていた。
修正後
df_route_link['key'] = df_route_link[['objectid', 'from_node_id', 'to_node_id']].apply(lambda x: '{}_{}_{}'.format(x[0], x[1], x[2]), axis=1)
df_route_link['key'] = df_route_link.apply(lambda x: '{}_{}_{}'.format(x["objectid"], x["from_node_id"], x["to_node_id"]), axis=1)
どっちもやっていることはほぼ同じ。
先に列をピックアップしてからapplyで行に対して処理するか、行で処理する際に必要な列をピックアップするか。
個人的には後者の方がわかりやすいので好み。
でも性能差があるのかどうかはわからない。先にピックアップした方が速そうな感じがしなくもない。
apply()について
https://note.nkmk.me/python-pandas-map-applymap-apply/
※引数axis=1とすると各行に対して適用されるらしい