はじめに
Pythonにおける、Pandasライブラリを利用したデータ変換を行う際に
詰まった箇所を戒めも兼ねてまとめました。
Seriesにおける値の結合
Seriesの要素に対して値を結合しようとした際ですが、
対象Seriesの値がNaNの箇所は結合されません。
有効な文字列を持っている行に対してのみ結合が行われます。
# 空のdfAに対して、一部の箇所の値がNaNであるdfBを代入
dfA["列名"] = dfB["列名"]
# 値がNaNの箇所は、要素どうしのの結合が行われない
dfA["列名"] = dfA["列名"] + dfC["列名"]
対処法
「.fillna("")」を利用し、NaNを空文字にする
# dfBに含まれているNaNを空文字に変換する
dfA["列名"] = dfB["列名"].fillna("")
# NaNが空文字に置き換えられているため、問題なく結合が行われる
dfA["列名"] = dfA["列名"] + dfC["列名"]
replace利用時の挙動の違い
.replace
行に入っている値の中身を全部変換する場合は、.strは不要
.str.replace
文字列操作(例えば文字列の一部置換など)の場合は、.strが必要
意図せず行の値がタプルになる
症状
データを入れる処理に続けて、
10行分のデータを入れている最中に下記のエラーが発生した
valueerror length of values (1) does not match length of index (10)
原因
エラーが発生した処理の1つ前の処理のコードを見ると、
以下のように不要なカンマがついていた。
dfA["列名"] = (固定値 + dfB["列名"],)
Pythonの構文上、最後にカンマがついているため
10行分のデータを持った1つのタプルとして判別されており
1行分のデータしか入っていない状態になっていた。
また、VSCodeのフォーマッターで自動的に括弧がつくのも
判別のしづらさに一役買い、原因箇所特定に時間を要してしまった。
対処法
不要なカンマを除去する
dfA["列名"] = (固定値 + dfB["列名"])
DataFrame値の文字列分割(.strつけ忘れ)
誤ったコード
下記のようにすると、dfB列における最初の3行を抽出してしまう。
dfA["列名"] = dfB["列名"][:3]
正しいコード
「.str」をつけると、dfB列の各要素における最初の3文字を取得する
dfA["列名"] = dfB["列名"].str[:3]
参考
- Pythonで要素が1個のタプルには末尾にカンマが必要