Python §36 : pandas検討用のデータ入力 | hitochan007のブログ(Pythonの勉強ブログ)

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

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

【Python:目次】

■pandas検討用のデータ入力■
●1.データ入力用関数の作成
●2.条件の設定とデータ入力
●3.データフレームの情報



●1.データ入力用関数の例


前回は、データファイルの中身を確認したり、ヘッダ部分の必要な情報を取り出したり、本データを取り出すための情報(区切り文字、スキップ数、ヘッダとして使う行の特定)をできるように工夫しました。

これらの作業は、実はエディタやエクセルなどを使って確認することもできますが、せっかくPythonを勉強しているので、プログラムで内容を確認する方法をあえてやってみました。

pandasは列数が異なる行が混在していると読み込み時にエラーが出てしまいましたが、エラーを回避するためにskiprowsという引き数を与えて、不要な行をスキップすることができます。また、必要であればヘッダ、つまり列名にあてはまる行を指定することもできます。そして、カンマやtabコードなど正確な区切り文字も指定することが重要です。

これらの情報が揃えば、pandasの読み込みを行うことができ、DataFrameにデータ入力することでそのあとは自由自在にデータ加工、統計計算、そして最終目標のグラフを描画するところまでが簡単にできるようになります。

まずは、データ入力用の関数Data_input()を作ってみましょう。

def data_input(rfilename,skiprow,head,delimiter):
#G1c
Path=WriteFilePath(Pathname='RW_Data') #パスの設定
print('Path=',Path,'\n')
os.chdir(Path)
data_pd = pd.io.parsers.read_csv(rfilename,delimiter=delimiter,header = head, float_precision = "high",skiprows=skiprow)
return data_pd


WriteFilePath関数は、データを入出力するフォルダを指定するもので、スクリプトが存在するパスの下に指定するようにします。(もしフォルダがなければ新たに生成します)

os.chdirはそのフォルダをカレントフォルダとする関数です。

引数は4つ、rfilename,skiprow,head,delimiter
読み込むファイル、スキップ数、ヘッダ行(不要の場合はNoneに設定します)、そして区切り文字です。

このパラメータを使って、pandasの入力関数 pd.io.parsers.read_csv を呼び出しています。
戻り値はデータフレームとなっていて、このデータ入力関数の戻り値にもしています。data_pdです。

●2.条件の設定とデータ入力


それではデータ入力のコードを書きましょう。

def prg_G1c(self):
print('G1c')
print('■データ入力:skiprows,headの指定')

rfilename='pd_data.tsv'
skiprow=5 #ヘッダを除く、スキップ行数
head=0 #スキップしたあとの行番号を指定すること 無視する場合はNone
delimiter='\t' #区切り文字 : delimiter=',' or delimiter='\t'
pd=data_input(rfilename,skiprow,head,delimiter) #データインプット関数
print("------------------------------")
print("■pd\n",pd)
print("------------------------------")
print("■pd.info()\n",pd.info())
print("------------------------------")
print("■pd.columns\n",pd.columns)
print("------------------------------")


4つの条件(引数)を設定してデータフレームpdが戻ってきました。


●3.データフレームの情報


pandasのデータフレームはprint()関数でも綺麗に整形して表示してくれます。

------------------------------
pd
No sec x sin(x) cos(x) tan(x) x^2
0 0 0 -3.141593 -1.224647e-16 -1.000000e+00 1.224647e-16 9.869604
1 1 60 -2.879793 -2.588190e-01 -9.659258e-01 2.679492e-01 8.293209
2 2 120 -2.617994 -5.000000e-01 -8.660254e-01 5.773503e-01 6.853892
3 3 180 -2.356194 -7.071068e-01 -7.071068e-01 1.000000e+00 5.551652
4 4 240 -2.094395 -8.660254e-01 -5.000000e-01 1.732051e+00 4.386491
5 5 300 -1.832596 -9.659258e-01 -2.588190e-01 3.732051e+00 3.358407
6 6 360 -1.570796 -1.000000e+00 6.123234e-17 -1.633124e+16 2.467401
7 7 420 -1.308997 -9.659258e-01 2.588190e-01 -3.732051e+00 1.713473
8 8 480 -1.047198 -8.660254e-01 5.000000e-01 -1.732051e+00 1.096623
9 9 540 -0.785398 -7.071068e-01 7.071068e-01 -1.000000e+00 0.616850
10 10 600 -0.523599 -5.000000e-01 8.660254e-01 -5.773503e-01 0.274156
11 11 660 -0.261799 -2.588190e-01 9.659258e-01 -2.679492e-01 0.068539
12 12 720 0.000000 0.000000e+00 1.000000e+00 0.000000e+00 0.000000
13 13 780 0.261799 2.588190e-01 9.659258e-01 2.679492e-01 0.068539
14 14 840 0.523599 5.000000e-01 8.660254e-01 5.773503e-01 0.274156
15 15 900 0.785398 7.071068e-01 7.071068e-01 1.000000e+00 0.616850
16 16 960 1.047198 8.660254e-01 5.000000e-01 1.732051e+00 1.096623
17 17 1020 1.308997 9.659258e-01 2.588190e-01 3.732051e+00 1.713473
18 18 1080 1.570796 1.000000e+00 6.123234e-17 1.633124e+16 2.467401
19 19 1140 1.832596 9.659258e-01 -2.588190e-01 -3.732051e+00 3.358407
20 20 1200 2.094395 8.660254e-01 -5.000000e-01 -1.732051e+00 4.386491
21 21 1260 2.356194 7.071068e-01 -7.071068e-01 -1.000000e+00 5.551652
22 22 1320 2.617994 5.000000e-01 -8.660254e-01 -5.773503e-01 6.853892
23 23 1380 2.879793 2.588190e-01 -9.659258e-01 -2.679492e-01 8.293209
24 24 1440 3.141593 1.224647e-16 -1.000000e+00 -1.224647e-16 9.869604
------------------------------


言い忘れていましたが、headはskiprowsで除外したあとの行数を指定します。今回は5行スキップして6行目をヘッダとして使うのでheadr=0としました。もし、ヘッダ行を使わない場合はheader=Noneとします。

info()関数を使えば、データフレームがどのような列名でどのような種類のデータであるかを調べることができます。以下が出力結果です。

------------------------------
<class 'pandas.core.frame.DataFrame'>
Int64Index: 25 entries, 0 to 24
Data columns (total 7 columns):
No 25 non-null int64
sec 25 non-null int64
x 25 non-null float64
sin(x) 25 non-null float64
cos(x) 25 non-null float64
tan(x) 25 non-null float64
x^2 25 non-null float64
dtypes: float64(5), int64(2)
memory usage: 1.6 KB
pd.info()
None
------------------------------


columns属性を調べると列名を調べることができます。
これらの情報は、次に行う「データ加工」にとても役に立ちます。

------------------------------
pd.columns
Index(['No', 'sec', 'x', 'sin(x)', 'cos(x)', 'tan(x)', 'x^2'], dtype='object')
------------------------------







pandasでデータ解析を行う前の処理について説明してきました。データの構造がわかっていれば、いきなりdelimiter、skiprowsやheader引数を指定して一発でpandasで読み込めることもわかりました。データフレームに入れてしまえばこっちのものです。あとは、とても協力な機能がデータ解析を助けてくれるはずです。

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

【read_csvの書式と引数の説明】
以下はデータフレームを読み出すread_csvの実例です。

data_pd = pd.io.parsers.read_csv(rfilename,delimiter=delimiter,header = head, float_precision = "high",skiprows=skiprow)

引数についての簡単な説明を示します。


チェック delimiterは区切り文字の指定
チェック skiprowsはスキップする行数を指定
チェック headerは列名に使うための行番号を指定
チェック header=Noneで、列名は整数になります
チェック データフレームになれば表示も整形されてきれいになる







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


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

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

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

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