LoginSignup
3
4

More than 5 years have passed since last update.

codecs と pandas を使う時の注意

Last updated at Posted at 2017-01-28

環境

バージョン

$ python --version
Python 2.7.12 :: Continuum Analytics, Inc.
$ pip freeze | grep pandas
pandas==0.19.1

サンプルファイル

$ file --mime sample.tsv
sample.tsv: text/plain; charset=utf-8
$ cat sample.tsv
ID  言語
1   日本語
2   英語

codecs

まず codecs ですが

>>> open("sample.tsv", "r").read()
'ID\t\xe8\xa8\x80\xe8\xaa\x9e\n1\t\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\n2\t\xe8\x8b\xb1\xe8\xaa\x9e\n'
>>> import codecs
>>> codecs.open("sample.tsv", "r", "utf-8").read()
u'ID\t\u8a00\u8a9e\n1\t\u65e5\u672c\u8a9e\n2\t\u82f1\u8a9e\n'

codecs で読み込むと unicode にしてくれます。

pandas

tsv を読み込む時に便利な read_table 関数。

>>> import pandas as pd
>>> df = pd.read_table(open("sample.tsv", "r"))
>>> df
   ID   言語
0   1  日本語
1   2   英語
>>> df.columns
Index([u'ID', u'言語'], dtype='object')
>>> df[u"言語"]
Traceback (most recent call last):
  ...
KeyError: u'\u8a00\u8a9e'
>>> list(df.columns)
['ID', '\xe8\xa8\x80\xe8\xaa\x9e']
>>> type(list(df.columns)[1])
<type 'str'>
>>> df["言語"]
0    日本語
1     英語
Name: 言語, dtype: object

df.columns の表示に u が着いてるのはよくわかりませんが、
文字列の型が str なのは納得ですね。

codecs & pandas

with read_table

では codecs を使って read_table で読み込むと

>>> df = pd.read_table(codecs.open("sample.tsv", "r", "utf-8"))
>>> df
   ID   言語
0   1  日本語
1   2   英語
>>> df[u"言語"]
Traceback (most recent call last):
  ...
KeyError: u'\u8a00\u8a9e'
>>> df["言語"]
0    日本語
1     英語
Name: 言語, dtype: object

なぜか str になるみたいです。

without read_table

>>> from collections import defaultdict
>>> data = defaultdict(list)
>>> f = codecs.open("sample.tsv", "r", "utf-8")
>>> labels = f.readline()[:-1].split("\t") # 改行以外をタブで分割
>>> values = f.readline()[:-1].split("\t") # 改行以外をタブで分割
>>> for label, value in zip(labels, values):
...     data[label].append(value)
... 
>>> df = pd.DataFrame(data)
>>> df
  ID   言語
0  1  日本語
>>> df["言語"]
Traceback (most recent call last):
  ...
KeyError: '\xe8\xa8\x80\xe8\xaa\x9e'
>>> df[u"言語"]
0    日本語
Name: 言語, dtype: object
>>> list(df.columns)
[u'ID', u'\u8a00\u8a9e']
>>> type(list(df.columns)[1])
<type 'unicode'>

read_table を使わずに
codecs で読み込んだ場合は、
想定通りでした。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4