safari029’s blog

暗号通貨、セキュリティ、データ解析、プログラミング等の技術を中心とした適当なメモです。。。

pandas備忘録

私が引っかかったポイントまとめ。

データ入力

read_csv文字コード指定

基本的にread_csvでデータを読むことが多いので、read_csv利用時の注意事項。

csvデータのエンコード形式に注意、特にWindows+excelで作成したcsvファイルの読み込み時

df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JIS')

"UnicodeDecodeError:"が発生した。これは文字コードが正しく指定できていないということ、 Shift_JISx0213 を指定するとうまく通った。

df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JISx0213')

データ整形

正規表現によるSeirieからの文字抽出

下記のように","区切りで読み込めないようなファイルから、正規表現で必要な文字列だけを抽出してDataFrameにする方法

以下サンプルデータ、そのままread_csvするとカラム数が違うためエラーとなる。

value1=12333,value2(fuga,hoge),value3=fuga
value1=111,value2(hoge),value3=fugahoge

読み取る場合はまず一列のデータとして読み取る。

In[2]: import pandas as pd
In[3]: df = pd.read_csv('test.csv',header=None,sep='\t')
In[4]: df
Out[4]: 
                                            0
0  value1=12333,value2(fuga,hoge),value3=fuga
1     value1=111,value2(hoge),value3=fugahoge

正規表現を持ちいた分割にはSeries.str.extract()を利用して分割する。

In[5]: df[0].str.extract('value1=(?P<val1>\d+),value2\((?P<val2>[\w,]+)\),value3=(?P<val3>.*)')
Out[5]: 
    val1       val2      val3
0  12333  fuga,hoge      fuga
1    111       hoge  fugahoge

”()”の中身が実際に抽出する値、”?P<hoge>”の部分でカラム名を指定できる。 指定しない場合は頭から順番に番号が振られる。

また、抽出した値はobjectとして返されるので、int型等に適宜変更する必要がある。

リンク元

http://minus9d.hatenablog.com/entry/2015/07/30/225841