Python §35 : pandas検討用のデータ確認 | hitochan007のブログ(Pythonの勉強ブログ)

hitochan007のブログ(Pythonの勉強ブログ)

★Pythonの勉強記録を中心に●pomera DM200、●パソコン、●グルメ、●愛犬(トイプードル) などについてのブログです

【Python:目次】

■pandas検討用のデータ確認■
●1.異なる列数のデータを確認する
●2.csvモジュールの読み込みは万能(csvとpandasモジュールの二段構え)
●3.ヘッダ情報の活用



●1.異なる列数のデータを確認する


下記のようなcsvファイル、あるいはtsvファイルを準備しました。

データ構成


このデータは、はじめの6行がヘッダ情報となっており、列数が様々です。このファイルをpandasの読み込み機能を使って、以下のようなコードで、DataFrameに入れることをトライしました。

def data_check_test(rfilename):
Path=WriteFilePath(Pathname='RW_Data') #パスの設定
print('Path=',Path,'\n')
os.chdir(Path)
print("■対象ファイル--->",rfilename)
delimiter=','
data_pd = pd.io.parsers.read_csv(rfilename,delimiter=delimiter,header = None )


すると以下のようにエラーが出ました。これは、多分列数が異なることに対してエラーが出たのだと思います。


エラー表示
pandas.parser.CParserError: Error tokenizing data. C error: Expected 2 fields in line 5, saw 7


●2.csvモジュールの読み込みは万能(csvとpandasモジュールの二段構え)

そこで、いきなりpandasの機能で読み込むのではなく、csvモジュールのを使って読み込んでからDataFrameに入れることをしてみました。

def data_check(rfilename,dialect):
Path=WriteFilePath(Pathname='RW_Data') #パスの設定
print('Path=',Path,'\n')
os.chdir(Path)
print("■対象ファイル--->",rfilename)

data=csv_read(rfilename, dialect=dialect)

check_row=10
for i,r in enumerate(data):
if i<check_row:
print(i,r,len(r))

pd0=DataFrame(data)
return pd0


def csv_read(rfilename, dialect='comma'):
#――――――――――――――――――――――――――――――――――――――――
# csv module でcsvファイルを読み込む
#――――――――――――――――――――――――――――――――――――――――

data1=[]
data2=[]
f = open(rfilename, 'rt')
try:
reader = csv.reader(f, dialect)
for row in reader:
data2.append(row)
finally:
f.close()
#for w in data2:
# data1.append('\t'.join(w))
return data2

すると、エラーは出ずに無事pd0というFrameDataに入力することができました。

●3.ヘッダ情報の活用


ここまでくれば、pandasの機能をいろいろ使えるようになるので、以下のコードのように読み出しはなんでも出来ます。

def prg_G1b(self):
print('G1b')
print('■データチェック pd_data.csv pd_data.tsv : 内容を確認')

rfilename='pd_data.csv'
dialect='comma'
pd0=data_check(rfilename,dialect)

#rfilename='pd_data.tsv'
#dialect='tab'
#pd0=data_check(rfilename,dialect)

print('■pd0.head(10)\n',pd0.head(10),'\n')
print('■pd0.tail(10)\n',pd0.tail(10),'\n')
print('■pd0.info()\n',pd0.info(),'\n')
print('■Start Date: pd0.ix[2,1]\n',pd0.ix[2,1],'\n')
print('■Start Time: pd0.ix[2,2]\n',pd0.ix[2,2],'\n')
print("■Start Date Time: pd.Timestamp(pd0.ix[2,1]+' '+pd0.ix[2,2])\n",pd.Timestamp(pd0.ix[2,1]+' '+pd0.ix[2,2]),'\n')



以下は出力結果です。(べたの文で見にくいですがご容赦を 文字数制限にかかってしまいました)


エラー表示
■対象ファイル---> pd_data.csv
0 ['file name:', 'pd_data.csv'] 2
1 ['data name:', 'data for pandas testing'] 2
2 ['start:', '2015/03/24', '08:47:12'] 3
3 ['data number:', '100'] 2
4 ['No', 'sec', 'x', 'ch1', 'ch2', 'ch3', 'ch4'] 7
5 ['No', 'sec', 'x', 'sin(x)', 'cos(x)', 'tan(x)', 'x^2'] 7
6 [0.0, 0.0, -3.14159265359, -1.22464679915e-16, -1.0, 1.22464679915e-16, 9.86960440109] 7
7 [1.0, 60.0, -2.87979326579, -0.258819045103, -0.965925826289, 0.267949192431, 8.29320925369] 7
8 [2.0, 120.0, -2.61799387799, -0.5, -0.866025403784, 0.57735026919, 6.8538919452] 7
9 [3.0, 180.0, -2.35619449019, -0.707106781187, -0.707106781187, 1.0, 5.55165247561] 7
■pd0.head(10)
0 1 2 3 4 \
0 file name: pd_data.csv None None None
1 data name: data for pandas testing None None None
2 start: 2015/03/24 08:47:12 None None
3 data number: 100 None None None
4 No sec x ch1 ch2
5 No sec x sin(x) cos(x)
6 0 0 -3.141593 -1.224647e-16 -1
7 1 60 -2.879793 -0.258819 -0.9659258
8 2 120 -2.617994 -0.5 -0.8660254
9 3 180 -2.356194 -0.7071068 -0.7071068

5 6
0 None None
1 None None
2 None None
3 None None
4 ch3 ch4
5 tan(x) x^2
6 1.224647e-16 9.869604
7 0.2679492 8.293209
8 0.5773503 6.853892
9 1 5.551652

■pd0.tail(10)
0 1 2 3 4 5 6
21 15 900 0.7853982 0.7071068 0.7071068 1 0.6168503
22 16 960 1.047198 0.8660254 0.5 1.732051 1.096623
23 17 1020 1.308997 0.9659258 0.258819 3.732051 1.713473
24 18 1080 1.570796 1 6.123234e-17 1.633124e+16 2.467401
25 19 1140 1.832596 0.9659258 -0.258819 -3.732051 3.358407
26 20 1200 2.094395 0.8660254 -0.5 -1.732051 4.386491
27 21 1260 2.356194 0.7071068 -0.7071068 -1 5.551652
28 22 1320 2.617994 0.5 -0.8660254 -0.5773503 6.853892
29 23 1380 2.879793 0.258819 -0.9659258 -0.2679492 8.293209
30 24 1440 3.141593 1.224647e-16 -1 -1.224647e-16 9.869604


Int64Index: 31 entries, 0 to 30
Data columns (total 7 columns):
0 31 non-null object
1 31 non-null object
2 28 non-null object
3 27 non-null object
4 27 non-null object
5 27 non-null object
6 27 non-null object
dtypes: object(7)
memory usage: 1.1 KB
■pd0.info()
None

■Start Date: pd0.ix[2,1]
2015/03/24

■Start Time: pd0.ix[2,2]
08:47:12

■Start Date Time: pd.Timestamp(pd0.ix[2,1]+' '+pd0.ix[2,2])
2015-03-24 08:47:12







以上のようにcsvモジュールで一度読み込んだ配列データを使ってpandasモジュールでDataFrameに入れる方法を使えば、列数が異なるデータファイルもエラー無く読み込めます。

→こちらがソースコードです。 (プラグラム名:Group1のG1b)


チェック 列数が異なるデータを利用する場合はcsvモジュールで配列にしてからpandasで読み込むこと
チェック 二段読み込み方式でヘッダ情報の一部を活用できる
チェック 一度データフレームにしてしまえば、強力なpandasの機能が使える


● ブログ記事を美しく書くには 


Python ブログランキングへ 
クリックしてね


新しいブログをはじめました。pythonの初級者から中級者まで、役に立つ記事を掲載していますので、ご覧ください。

特にカスタム関数(ユーザー定義関数)は、便利に使えると思います。

ぜひぜひこのリンクをクリックしてください 

 Pythonを勉強して株で儲けるブログ