🔖

Pandasで1行目と2行目の列数が違い、かつデリミタが複数指定だと、1列目がIndex Nameに持っていかれる

2022/01/05に公開

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を列に持ってきても良かったかもしれない
GitHubで編集を提案

Discussion