読者です 読者をやめる 読者になる 読者になる

計算物理屋の研究備忘録

Linux, Cygwin, Mac, zsh, emacs等の使い方、設定などのメモ

Pythonでpandasを使う

目次

インストール

pipとかcondaコマンドを使って入れるだけ。

$ conda install pandas

import

決まり文句

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

使い方

csvファイルの読み込み

csvファイルの例。これを例として使う

$ cat test.csv
x,  y, z
1, 83, 73
2, 76, 92
3, 50, 67
4, 42, 71
5, 94, 89

csvファイルをデータフレームとして読み込む

デフォルトでは1行目がheaderとして判断されて、そのままカラム名になる。

test_df = pd.read_csv('test.csv')
   x    y   z
0  1   83  73
1  2   76  92
2  3   50  67
3  4   42  71
4  5   94  89

コンマ区切りじゃないとき

sep=で区切り文字を変えられるし、delim_whitespace=Trueで空白とtabで区切ることができる

test_df = pd.read_csv('test.csv', sep='|')                  # '|'で区切る
test_df = pd.read_csv('test.csv', delim_whitespace=True)    # 空白タブ区切り

headerが無い場合

header=Noneを指定

test_df = pd.read_csv('test.csv', header=None)
   0    1    2
0  x    y    z
1  1   83   73
2  2   76   92
3  3   50   67
4  4   42   71
5  5   94   89

最初の数行をskip

skiprows=で飛ばしたい行数を整数で指定

test_df = pd.read_csv('test.csv', header=None, skiprows=3)
   0   1   2
0  3  50  67
1  4  42  71
2  5  94  89

n行目をskip

skiprows=で飛ばしたい行のインデックス?を指定

test_df = pd.read_csv('test.csv', header=None, skiprows=[0,2,4])
   0   1   2
0  1  83  73
1  3  50  67
2  5  94  89

カラム名を指定して読み込む

''names=''で指定する

test_df = pd.read_csv('test.csv', header=None, skiprows=1, names=['番号', '数学','英語'])
   番号  数学  英語
0     1    83    73
1     2    76    92
2     3    50    67
3     4    42    71
4     5    94    89

カラム名、インデックス名を変える

あとからデータフレームのカラム名やインデックス名を変えることができる。 DataFrame.columns=DataFrame.index=(DataFrameはデータフレームの名前)にリストで与えてやればいい。

test_df.columns=['番号', '物理','化学']
test_df.index=['A', 'B', 'C', 'D', 'E']
   番号  物理  化学
A     1    83    73
B     2    76    92
C     3    50    67
D     4    42    71
E     5    94    89

データの参照方法

いくつか方法があるが、ixを使う方法は覚えておくべき。他は使わなくてもいい。
このデータフレームを例として使用
test_df

   番号  数学  英語
0     1    83    73
1     2    76    92
2     3    50    67
3     4    42    71
4     5    94    89

行をスライシング

test_df[0]などの指定はエラーになる。スライシングはできる。ちょっとわかりにくい。使わない。

test_df[0:3]
   番号  数学  英語
0     1    83    73
1     2    76    92
2     3    50    67

カラム名を指定

test_df['番号']
0    1
1    2
2    3
3    4
4    5

複数指定するときはリストで。「[]」が2重になるので忘れないように

test_df[['番号','数学']]
   番号  数学
0     1    83
1     2    76
2     3    50
3     4    42
4     5    94

DataFrame.ix を使う

この使い方をマスターしておく。test_df.ix[行, 列]のように使う。
番号2番の数学の点数は

test_df.ix[1, 1]
76

番号と数学の点数。カラムを番号でスライシング。test_df.ix[:, 0:2]とすると含まれるカラムの番号は0, 1となり2が含まれないので注意(0:番号、1:数学、2:英語)。これはrangeとかと同じ

test_df.ix[:, 0:2]
   番号  数学
0     1    83
1     2    76
2     3    50
3     4    42
4     5    94

カラム名でスライシングができる。test_df.ix[:, '番号':'英語']のようにすると上とは違って英語までが含まれるので注意!

test_df.ix[:, '番号':'英語']
   番号  数学  英語
0     1    83    73
1     2    76    92
2     3    50    67
3     4    42    71
4     5    94    89

条件でフィルタ

普通に条件比較を行うとbool型のSeriesかDataFrameが返ってくる。 例えば数学が80点以上という条件では

test_df['数学'] >= 80
0     True
1    False
2    False
3    False
4     True

このようにbool型のSeriesが得られる。これを元のデータフレームにtest_df[]の形で入れてやると数学で80点以上とった人をフィルタできる。

test_df[test_df['数学'] >= 80]
   番号  数学  英語
0     1    83    73
4     5    94    89

数学で80点以上取った人の英語の点数を抜き出すこともできる。test_df[test_df['数学'] >= 80]がDataFrameなのでカラム名をその後に指定する。

test_df[test_df['数学'] >= 80]['英語']
0    73
4    89

データ解析

合計値を求める

DataFrame.sum()が用意されている。デフォルトでは列の合計値(axis=0の省略)。

test_df.sum()
番号     15
数学    345
英語    392

行の合計値はDataFrame.sum(axis=1)。数学と英語の合計を出してみる。スライシングを使って番号の数値が足されないようにする。

test_df.ix[:, 1:].sum(axis=1)    # 0番目のカラムは番号なので外している
0    156
1    168
2    117
3    113
4    183

列にデータを追加する

列にデータを追加するときは辞書を使うように簡単に追加できる。 上でやった、数学と英語の合計値を隣に追加してみる。

test_df['合計'] = test_df.ix[:, 1:].sum(axis=1)
   番号  数学  英語   合計
0     1   83   73    156
1     2   76   92    168
2     3   50   67    117
3     4   42   71    113
4     5   94   89    183