🔖
Pandasで1行目と2行目の列数が違い、かつデリミタが複数指定だと、1列目がIndex Nameに持っていかれる
TL;DR
Pandasでread_csv
などを用いる際、列数が異なる行があるとエラーが発生します。しかし、sep='\t|,'
のようにデリミタが複数指定されていると忖度が行われる(エラーが起きない)ようです。
デリミタが複数指定(あるいは正規表現として解釈される場合)、かつheader=None
の場合で、1行目と2行目の列数が異なる場合、1列目がIndex Nameとして使用されます。
※この分野に詳しくないので、誤っていたらぜひ教えて下さい。
動機
日本語の文章をMeCabで形態素解析したものを読み込んでいて、どうしても1列目がIndex Nameに持っていかれるので困っていました。
結論としては以下のあわせ技でした。
- Pandasでは全角スペースをデフォルトで値なしとして扱う
- Pandasでは、read_tableでHeaderの指定がない場合、1行目と2行目でカラム数が違うなら1列目をIndex Nameに用いる
詳細
1行目のみ1列少ないデータを用意します。
吾輩 名詞,代名詞,一般,*,*,*,吾輩,ワガハイ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
猫 名詞,一般,*,*,*,*,猫,ネコ,ネコ
で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
これをセパレータ複数、ヘッダー無しで読み込むと...
df = pd.read_table('./files/test.csv', sep='\t|,', header=None)
df.head()
以下のように、1列目がIndex Nameに持っていかれます。
0 1 2 3 4 5 6 7 8
吾輩 名詞 代名詞 一般 * * * 吾輩 ワガハイ None
は 助詞 係助詞 * * * * は ハ ワ
猫 名詞 一般 * * * * 猫 ネコ ネコ
で 助動詞 * * * 特殊・ダ 連用形 だ デ デ
ある 助動詞 * * * 五段・ラ行アル 基本形 ある アル アル
まとめ
-
read_table
で複雑なデリミタを指定する場合は挙動に気をつける - 全角スペース(に限らず、分析対象外のデータ)はなるべく早い段階で取り除く
- 汚いデータを整形するのもPandasの仕事と割り切って、Index Nameを列に持ってきても良かったかもしれない
Discussion