pandasをインストールしておく
openpyxl, xlrdもインストールしておく
pythonのソースではまず最初にインポートしておく
データはCSVで扱うのが楽で良い
分からないときは pandas等のキーワードと探したい機能でググる
jupter notebookをインストールして機能/動作の確認作業を行うと楽。
読み込みは read_csv, read_excelで一発
デフォルトではヘッダがcolumn名となったDataFrameが作られる。
注意 : 項目名に'-'等 間違って解釈されやすい文字が含まれていれば、最初にrenameしておくのが安全。'-'は減算やマイナス等と評価されることがある。
zipでもそのま読み込める(.gz, .bz2, .zip, .xz)
URLも読み込める
Excelの読み込みにはopenpyxl, xlrdが必要
読み込み後に16進数から数値に変換
オプション指定
オプション | 機能 |
---|---|
header=None | ヘッダなし |
header=0 | ヘッダの行位置、それ以降の行を読み込み |
index_col=0 | インデックス(行名)として使いたいカラム指定 デフォルトインデックスなし(連番が行名となる) |
usecols=[1, 3] | 読み込むカラム(列)番号指定 |
usecols=['a', 'c'] | カラム名(列名)でも良い |
dtype={'b': str, 'c': str} | 指定列の型指定 |
na_values=['-'] | 欠損値として扱うデータを追加 |
na_filter=False | 欠損値として扱わない |
encoding='cp932' | エンコード指定 |
オプション | 機能 |
---|---|
sheet_name=[0, 'sheet2'] | 複数シートの読み込み→辞書形式 book[0], book['sheet2']がDataFrame |
sheet_name=Non | 全シート読み込み、シート名がキーの辞書 |
header=None | ヘッダなし |
index_col=None | インデックスなし(連番の行名となる) |
usecols=[0, 1, 3] | 読み込むカラム(列)番号指定 |
skiprows=[1] | 読み飛ばす行指定 |
skipfooter=1 | 読み込まない最後からの行数 |
CSV
オプション | 機能 |
---|---|
header=False | ヘッダなし |
index=False | インデックスなし(行名を出力しない) |
encoding='cp932' | エンコード指定 |
sep='\t' | 区切り文字指定、デフォルトは',' |
mode='a' | 書き込みモード w a x(すでに同名ファイルが存在すればエラー) |
float_format='%.3f' | floatの書出し形式 printf書式 |
Excel
オプション | 機能 |
---|---|
sheet_name='new_sheet_name' | シート名指定 デフォルトは'sheet1' |
header=False | ヘッダなし |
index=False | インデックスなし(行名を出力しない) |
mode='a' | 追記モード(シートを追加する、同名シートの上書きはしない) |
データ型 dtype |
型コード | 説明 |
---|---|---|
int8 | i1 | 符号あり8ビット整数型 |
int16 | i2 | 符号あり16ビット整数型 |
int32 | i4 | 符号あり32ビット整数型 |
int64 | i8 | 符号あり64ビット整数型 |
uint8 | u1 | 符号なし8ビット整数型 |
uint16 | u2 | 符号なし16ビット整数型 |
uint32 | u4 | 符号なし32ビット整数型 |
uint64 | u8 | 符号なし64ビット整数型 |
float16 | f2 | 半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット) |
float32 | f4 | 単精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット) |
float64 | f8 | 倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット) |
float128 | f16 | 四倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット) |
complex64 | c8 | 複素数(実部・虚部がそれぞれfloat32) |
complex128 | c16 | 複素数(実部・虚部がそれぞれfloat64) |
complex256 | c32 | 複素数(実部・虚部がそれぞれfloat128) |
bool | ? | ブール型(True or False) |
object | O | Pythonオブジェクト型 |
データ型名の末尾の数字はbitで表し、型コード末尾の数字はbyteで表す。同じ型でも値が違うので注意。
bool型の型コード?は不明という意味ではなく文字通り?が割り当てられている。
import pandas as pd s = pd.Series([1, 2, 3], index = ['i1', 'i2', 'i3']) d = pd.DataFrame({'c1': [11, 21, 31], 'c2': [12, 22, 32], 'c3': [13, 23, 33]}, index = ['i1', 'i2', 'i3'])
以下でリストの部分はリスト-likeなものnumpy.array, pd.Series, sliceでも良い
d[x] 形式
series | ⇒結果 | DataFrame | ⇒結果 |
---|---|---|---|
行名 s['i1'] |
→ 単一の値 | 列名 d['c1'] |
→ series |
行名のリスト d[['i1','i2']] |
→series | 列名のリスト d[['c1','c2']] |
→DataFrame |
行番号 s[1] | → 単一の値 | 列番号 d[1] 列名が定義済のときはNG 列名が未定義のときはOK |
→エラー → series |
行番号のリスト s[[1,2]] |
→series | 列番号のリスト d[[1,2]] 列名が定義済のときはNG 列名が未定義のときはOK |
→エラー →DataFrame |
行数と同じ長さのboolのリスト s[[True,True,False]] |
→series | 行数と同じ長さのboolのリスト d[[True,True,False]] |
→DataFrame |
d.loc[行指定] または d.loc[行指定,列指定]
d.iloc[行指定] または d.iloc[行指定,列指定]
boolのリスト作成
参照とcopyの区別を意識する。
参照は元のデータを変更でき、copyは変更できない。
DataFrame内の単一データを変数に代入した場合コピーとなる。
「データ参照(選択)」で一旦取り出したオブジェクトを更に条件指定するとコピーとなる。
DataFrameの行や列の条件の場合、参照となる。
import pandas as pd s = pd.Series([1, 2, 3], index = ['i1', 'i2', 'i3']) d = pd.DataFrame({'c1': [11, 21, 31], 'c2': [12, 22, 32], 'c3': [13, 23, 33]}, index = ['i1', 'i2', 'i3'])
以下でリストの部分はリスト-likeなものnumpy.array, pd.Series, sliceでも良い
以下で行名、列名、行番号、列番号の部分はそれぞれのリストでも良い。ただし、代入値も同じサイズのリストを指定する必要が在る。
書式 | 備考 |
---|---|
d['c1']=1 d[['c1','c2']]=[1,2] d.c1=1 d.c1=[1,2,3] d[['c1','c2']]=pd.DataFrame({'c1':[41,42,43],'c2':[51,52,53]}) |
列指定 列名'c1'の要素が全部 1 となる。 d.c1とも書ける 代入する値は代入先の行数と同じサイズのリストでも良い。代入先が1列でないときに行毎の値をリスト指定する場合は 同型のDataFrameにして代入。 |
d[条件式]=1 d[d > 20]=1 |
要素条件 条件式を満たす要素が全部 1 となる。 条件式はboolのリストとなりTrueの場所を選択する 代入する値は単一の要素の値 |
d.loc['i1']=2 d.loc['i1']=[1,2,3] |
行名指定 行名'i1'の要素が全部 2 となる。 locには行名、列名を使用する。 代入する値は代入先の列数と同じサイズのリストでも良い。 |
d.loc['i1','c1']=2 | 行名と列名で要素を指定 行名'i1'、列名'c1'の値が 2 となる。 locには行名、列名を使用する。リストでも良い。 |
d.loc[行の条件式, 列名] = x d.loc[行名, 列の条件式] = x d.loc[行の条件式, 列の条件式] = x d.loc[d.c2==12,'c2':'c3']=10 |
行と列の条件指定 行の条件式は行数と同じ数のbool要素を持つものを指定 列の条件式は列数と同じ数のbool要素を持つものを指定 スライスの指定でも良い。 行名、列名はリストでも良い 例はc2の値が12の行を選び、c2,c3の列を10にする 注意: 列の条件式では列毎にデータ型が違うことがある |
d.iloc[2]=2 d.iloc[[1,2]]=[1,2,3] |
行番号指定 2行目の要素が全部 2 となる。 1,2行目が[1,2,3]となる。 ilocには行番号、列番号を使用する。 |
d.iloc[1,2]=2 d.iloc[1,[1,2]]=2 |
行番号と列番号で要素を指定 1行目の2列目の値が 2 となる。 1行目の1,2列目の値が 2 となる。 ilocには行番号、列番号を使用する。 |
列毎にデータ型が異なる場合にはmap等で評価してboolリストを作る
方法 | 内容 |
---|---|
d['D']=0 | 'D'は無いので、column="D"を追加し、0を入れる |
d['D']=[4,7] | 'D'は無いので、column="D"を追加し、リストの値を入れる 要素数は同じでないといけない |
d['D'] = d['b']+1 | series d['b]に+1したものをcolumn"D"として追加 indexが一致しないとNaNになる 要素数は同じでないといけない |
d.assign(a=0) d.assign(D=[9,10]) d.assign(a=1,D=0) |
存在するcolumn名の場合置換え 異なる場合追加 同時に複数可能 新規オブジェクトを返す |
d.insert(0, 'H', 0) d.insert(len(d.columns), 'H', [8,9]) |
挿入: 引数は位置、column名,値→戻値なし 元データを置換える 位置に-1は使えない |
d.append(d) d.append(sc,ignore_index=True) |
配列やSeries,dataFrameを追加する。 配列も追加できるが列名が0と成る。 新規オブジェクトを返す 列名や行名に注意、異なると追加される SeriesのインデックスがDataFrameの列名となる 追加方向は縦(行方向)のみ ignore_index=Trueでインデックス(行名)を無視(削除して)追加される 将来無くなる機能 |
pd.concat([d, d]) pd.concat([d, d],axis=1) pd.concat([d, s], axis=1) pd.concat([d, s], axis=1,join='inner') |
結合 : 引数は、結合するデータのリスト、 結合方向 縦:axis=0 横:axis=1 デフォルトは縦、 join= [inner|outer] innerで共通するものだけ、デフォルトはouter(全部) 新規オブジェクトを返す DataFrameとSeriesの場合、axis=0(デフォルト)ではSeriesのNameが無視される、axis=1ではNameが列名となる。 縦に項目を追加する場合、loc,iloc等の方法を使う方が良い。 |
方法 | 内容 |
---|---|
del d['c'] | column 'c'を削除、元データを変更、一度に1列のみ削除可能 |
d.drop(0) d.drop([0,1]) d.drop(index=[...]) d.drop([0,1],axis=1) d.drop(columns=[...]) |
行 または列の削除、引数はindexまたはそのリスト、行番号またはそのリスト columns またはaxis=1で列を削除 新規オブジェクトを返す |
d.pop('a') | 指定列を元データから切り取って返す 行方向はできない、Tで転置したオブジェクトを作ってからpopすることはできるが行名の処理等が面倒、push()は無い |
関数 | オプション | 内容 |
---|---|---|
drop | inplace=True | 元データを変更する |
in_use_wifi = book.query('(WiFi.astype("str").str.match("[0-9a-fA-F][0-9a-fA-F]"))', engine='python').copy()
in_use_mac.loc[:,'MAC'] = in_use_mac['MAC'].map(lambda x: x.lower().replace('.','-').replace(':','-'))
pc = in_use_multi_mac[['MAC','dep','id']].values
pc = np.delete(pc,[(x[0] in mac_in_multi) for x in pc],axis=0)
d_maker = dict(zip(maker['code'],maker['maker']))
mac_list['maker'] = mac_list['maker'].fillna('unknown')
df['loc'] = df['id'].str.cat(df['section'],sep='/')
pickup_re = re.compile('SEAT\s*\:\s*([0-9a-fA-F]+)',flags=re.DOTALL)
df['seat'] = df['備考'].map(lambda x: pickup_re.search(x).group(1))
','.join(re.search('(\d\d).*(\d)',x).group(1,2))
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]],columns=['a','b','c','d'])
df = df.set_index(['a','b'])
display(df)
display(df.index)
display(df.values)
c d
a b
1 2 3 4
5 6 7 8
MultiIndex([(1, 2),
(5, 6)],
names=['a', 'b'])
array([[3, 4],
[7, 8]], dtype=int64)
dc = df.to_dict(orient='index')
display(dc)
{(1, 2): {'c': 3, 'd': 4}, (5, 6): {'c': 7, 'd': 8}}
→ インデックス名は消えている
キーをタプルで指定してアクセスできる。
キーはリスト(配列)ではないので注意
キーが存在するかは通常通り in で調べられる。
if (1,2) in dc:
pass
dn = pd.DataFrame.from_dict(dc,orient='index')
dn.index.rename(['a','b'],inplace=True)
display(dn)
c d
a b
1 2 3 4
5 6 7 8