-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_Pandas
- 戻る(Python) > Pythonセカンド・ステップ
- NumPy
- Pandas
- Matplotlib
Pandas(パンダス)は数表の形式で保存されたデータを効率的に処理する機能を収録したライブラリ
-
BSDライセンスのもとで提供されているOSSライブラリ。
-
特に、DML的な処理(高度午前 - 技術要素 - データベースの該当節を参照)で、
- 数表および
- 時系列データを
操作するためのデータ構造と演算を提供
(Pythonから簡単に利用できるSQLの代替) -
ビッグデータの対応は、
≒ なSpark SQLとDataFrame APIで。
>pip install pandas
>>>import pandas as pd
Series型は、一次元の配列のオブジェクト
>>>pd.Series([3,7,10,13])
0 3
1 7
2 10
3 13
dtype: int64
NumPyの配列から
>>>numpy_array = np.array([3,7,10,13])
>>>pd.Series(numpy_array)
0 3
1 7
2 10
3 13
dtype: int64
>>>ss=pd.Series([3,7,10,13])
-
以下は参照渡し
>>>ss2=ss -
コピーする場合は以下
>>>ss2=ss.copy()
>>>x=pd.Series([3,7,10,13])
>>>x[1]
7
-
スライシング
>>>x[1:3] -
配列でインデックスを指定
以下ではnp.arrayを使っているが、普通の配列でも指定可能。>>>x[np.array([1,2])] -
比較演算
-
5以上の値を調査。
>>>x>=5 0 False 1 True 2 True 3 True dtype: bool -
5以上の値を抽出。
>>>x[x>=5] 1 7 2 10 3 13 dtype: int64
-
※ インデックスにtrue, falseのSeriesが指定され抽出される。
配列の取り出し
>>>x.values
array([ 3, 7, 10, 13], dtype=int64)
DataFrame型は、テーブル形式のデータ構造
>>> pd.DataFrame({
... 'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
... 'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
... 'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
xxx yyy zzz
0 aaa 20 AAA
1 bbb 34 BBB
2 ccc 50 CCC
3 ddd 12 DDD
4 eee 62 EEE
5 fff 22 FFF
NumPyの行列(2次配列)から → NP ⇔ DF型変換
>>>df = pd.read_csv('hoge.csv')
※ サンプル・データ: temp.csv
-
openpyxlが必要
>!pip install openpyxl -
Excel読込
>>>df = pd.read_excel('hoge.xlsx')
※ サンプル・データ: temp.xlsx
>>> df=pd.DataFrame({
... 'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
... 'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
... 'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
-
以下は参照渡し
>>>df2=df -
コピーする場合は以下
>>>df2=df.copy()
→ 先頭・後尾
>>> df=pd.DataFrame({
... 'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
... 'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
... 'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
>>> df
xxx yyy zzz
0 aaa 20 AAA
1 bbb 34 BBB
2 ccc 50 CCC
3 ddd 12 DDD
4 eee 62 EEE
5 fff 22 FFF
-
先頭
-
先頭5行を出力(既定値)
>>>df.head() -
先頭2行を出力(明示)
>>>df.head(2)
-
-
後尾
-
後尾5行を出力(既定値)
>>>df.tail() -
後尾2行を出力(明示)
>>>df.tail(2)
-
-
行指定
>>>df.iloc[1] -
列指定
NumPyと同様にスライシングが可能>>>df.iloc[:,1] -
行列指定
-
行列番号
>>>df.iloc[1,0] 'bbb' -
行番号・列名
>df.loc[1,'xxx'] 'bbb'
-
-
スライシング
-
行
>>>df.iloc[2:4] -
列
>>>df.iloc[:,1]
-
-
配列でインデックスを指定
以下ではnp.arrayを使っているが、普通の配列でも指定可能。-
行インデックス
>>>df.iloc[np.array([2,3])] -
行&列インデックス
>>>df.iloc[np.array([2,3]), np.array([1,2])]
-
-
比較演算
-
30以上のyyy列の値を調査。
>>>df.yyy >= 30 -
30以上のyyy列の値を抽出。
>>>df[df.yyy >= 30]
※ インデックスにname=yyyのtrue, falseのSeriesが指定され抽出される。
-
m行n列の二次元行列が取得できる。
>>>df.values
-
1行指定する場合はSeries
>>>df.iloc[2] xxx ccc yyy 50 zzz CCC Name: 2, dtype: object -
複数行指定(行を配列で指定)する場合はDataFrame
>>>df.iloc[[2]] xxx yyy zzz 2 ccc 50 CCC
-
1列指定する場合はSeries
行はスライシングで全行指定。>>>df.loc[:,'yyy'] 0 20 1 34 2 50 3 12 4 62 5 22 Name: yyy, dtype: int64 -
複数列指定(列を配列で指定)する場合はDataFrame
-
行はスライシングで全行指定
>>>df.loc[:,['yyy']] yyy 0 20 1 34 2 50 3 12 4 62 5 22 -
列名のみ指定しても結果は同じ
>>>df[['yyy']] yyy 0 20 1 34 2 50 3 12 4 62 5 22
-
- 行編集: axis=0
- 列編集: axis=1
-
concatを使った例
>>>row=pd.DataFrame({ 'xxx': 'ggg', 'yyy': [45], 'zzz': 'GGG'}) >>> df=pd.concat([df,row],axis=0) >>> df xxx yyy zzz 0 aaa 20 AAA 1 bbb 34 BBB 2 ccc 50 CCC 3 ddd 12 DDD 4 eee 62 EEE 5 fff 22 FFF 0 ggg 45 GGG -
インデックス再設定
>>>df.index=np.arange(len(df)) >>> df xxx yyy zzz 0 aaa 20 AAA 1 bbb 34 BBB 2 ccc 50 CCC 3 ddd 12 DDD 4 eee 62 EEE 5 fff 22 FFF 6 ggg 45 GGG
-
簡単な例
>>>df['XXX']=['X1','X2','X3','X4','X5','X6'] >>>df xxx yyy zzz XXX 0 aaa 20 AAA X1 1 bbb 34 BBB X2 2 ccc 50 CCC X3 3 ddd 12 DDD X4 4 eee 62 EEE X5 5 fff 22 FFF X6 -
concatを使った例
>>>col=pd.DataFrame({'YYY':['Y1','Y2','Y3','Y4','Y5','Y6']}) >>>df=pd.concat([df,col],axis=1) >>>df xxx yyy zzz XXX YYY 0 aaa 20 AAA X1 Y1 1 bbb 34 BBB X2 Y2 2 ccc 50 CCC X3 Y3 3 ddd 12 DDD X4 Y4 4 eee 62 EEE X5 Y5 5 fff 22 FFF X6 Y6
>>>df=df.drop(2,axis=0)
>>> df
xxx yyy zzz XXX YYY
0 aaa 20 AAA X1 Y1
1 bbb 34 BBB X2 Y2
3 ddd 12 DDD X4 Y4
4 eee 62 EEE X5 Y5
5 fff 22 FFF X6 Y6
>>>df=df.drop('yyy',axis=1)
>>>df
xxx zzz XXX YYY
0 aaa AAA X1 Y1
1 bbb BBB X2 Y2
3 ddd DDD X4 Y4
4 eee EEE X5 Y5
5 fff FFF X6 Y6
-
列名の変更
>>>df.columns=['AAA','BBB','CCC','DDD'] >>>df AAA BBB CCC DDD 0 aaa AAA X1 Y1 1 bbb BBB X2 Y2 3 ddd DDD X4 Y4 4 eee EEE X5 Y5 5 fff FFF X6 Y6 -
列名・行名の変更
>>>df=df.rename(columns={'DDD': 'XXX'}, index={5: 'hoge'}) >>>df AAA BBB CCC XXX 0 aaa AAA X1 Y1 1 bbb BBB X2 Y2 3 ddd DDD X4 Y4 4 eee EEE X5 Y5 hoge fff FFF X6 Y6
列値を%に単位変更する(100倍する)などの一括変更。
>>>pd.DataFrame({
... 'xxx': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], # 長さ: 6
... 'yyy': [20, 34, 50, 12, 62, 22], # 長さ: 6
... 'zzz':['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF'] # 長さ: 6
... })
>>>df.iloc[:,1:2] = df.iloc[:,1:2] * 100
xxx yyy zzz
0 aaa 2000 AAA
1 bbb 3400 BBB
2 ccc 5000 CCC
3 ddd 1200 DDD
4 eee 6200 EEE
5 fff 2200 FFF
6 ggg 4500 GGG
df=df.transpose()
inplace=Trueを設定すると、元を変更する。
>>>df.drop('yyy',axis=1,inplace=True)
>>>df
※ drop、rename、dropnaなどメソッドに指定できる。
-
DF → SS
アクセスの所で幾らか説明済み。 -
SS → DF
>>>df = pd.DataFrame(pd.Series([3,7,10,13])) >>>df
-
NP → DF
-
NP初期化
>>>np_arr=np.array([[1,2,3],[4,5,6]]) -
列名付与
>>>df=pd.DataFrame(np_arr,columns=['a','b','c'])
-
-
DF → NP
-
np.arrayメソッド
>>>np_arr=np.array(df) -
df.valuesプロパティ
>>>np_arr=df.values
-
>>>df=pd.DataFrame({
... '0': ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09'], # 長さ: 10
... '1': ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'], # 長さ: 10
... '2': ['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'] # 長さ: 10
})
>>>df=df.astype('int')
-
m~n列を行集計
>>>ss_sum = df.iloc[:, m:n].sum(axis=0) >>>df_sum = pd.DataFrame(ss_sum) >>>df_sum = df_sum.rename(columns={0: 'sum'}) -
集計行として追加
>>>df=pd.concat([df,df_sum.transpose()],axis=0) >>>df
-
m~n列を列集計
>>>ss_sum = df.iloc[:,[1,2]].sum(axis=1) >>>df_sum = pd.DataFrame(ss_sum) >>>df_sum = df_sum.rename(columns={0: 'sum'}) -
集計列として追加
>>>df=pd.concat([df,df_sum],axis=1)
はデータマイニング(DM)- Pythonの該当節を参照。
-
Xを含む要素をXで一括置換
>>>df['列名'] = df['列名'].str.replace('.*(置換前).*', '置換後', regex=True) -
要素を要素中の[,]と[.]で囲まれた文字列で一括置換
list_col1 = [i.split(",")[1].split(".")[0].strip() for i in df["col1"]] df["col1"] = pd.Series(list_col1) nparr_col1 = df["col1"].unique() for cell in nparr_col1: df['col1'] = df['col1'].str.replace('.*({0}\.).*'.format(cell), cell, regex=True)
>>>df['補完対象列名'] = df.groupby('グループ化列名')['補完対象列名'].transform(lambda d: d.fillna(d.mean()))
特徴量の選択とエンジニアリングとは?(機械学習(machine learning)の該当節を参照)
-
通常
>>>df.describe() -
小数点以下、切捨
>>>df.describe().astype(int)
説明変数の表(DataFrame)から相関係数行列を生成。
>>>df.corr()
※ ヒートマップで可視化する方法はコチラの該当節。
説明変数の表(DataFrame)を散布図行列(Matplotlibの該当節を参照)として可視化。
>>>X = (df.iloc[:, m:n] - df.iloc[:, m:n].mean()) / df.iloc[:, m:n].std()
>>>X.describe()
※ 平均が ≒ 0、標準偏差 ≒ 1 になればOK。
-
カテゴリを列に展開(0・1化)など。
pd.get_dummies(df['カテゴリ列の列名']) -
展開した列を表に追加する流れ
df_dummy = pd.get_dummies(df['カテゴリ列の列名']) df = pd.concat([df, df_dummy], axis=1) df.head()
-
pandas - Wikipedia
https://ja.wikipedia.org/wiki/Pandas -
pandas - Python Data Analysis Library
https://pandas.pydata.org/- pandas documentation — pandas 1.4.3 documentation
https://pandas.pydata.org/docs/
- pandas documentation — pandas 1.4.3 documentation
-
Qiita
- データ分析で頻出のPandas基本操作
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a - SQLでやるこの操作ってpandas.DataFrameではどうやるの!
https://qiita.com/HiromuMasuda0228/items/d62a47cf9b83481929a7 - SQL と Pandas の対応表
https://qiita.com/takaiyuk/items/5232442eaeb01299b265
- データ分析で頻出のPandas基本操作
-
DxCommon/PandasTraining.ipynb at develop · OpenTouryoProject/DxCommon · GitHub
https://github.com/OpenTouryoProject/DxCommon/blob/master/Notebook/path/PandasTraining.ipynb
移行メモ
- 「SS ⇔ DF型変換」の 2 項目のラベルが入れ替わっていた。 「アクセスの所で説明済み」なのは DataFrame から Series を取り出す操作(DF → SS)、
pd.DataFrame(pd.Series(...))は Series から DataFrame を作る操作(SS → DF)のため、 ラベルを入れ替えた。- 「集計操作」で、行方向(axis=0)の集計結果は「集計行」として、 列方向(axis=1)の集計結果は「集計列」として追加されるが、 ラベルが逆になっていたため入れ替えた。あわせて見出し「行方向に集系」→「行方向に集計」。
df.iloc[:,[m:n]]は Python の構文として誤りのためdf.iloc[:, m:n]に修正した。- 「要列名付与」→「列名付与」、 「先頭2行を出力(明示)」が
df.tail(2)の説明に付いていたため「後尾2行」に修正した。- 「5より大きい値」「30より大きい値」の例は条件が
>=(以上)のため 「5以上の値」「30以上の値」に改めた。- 「列値の一括変更」の実行結果に、直前の DataFrame(6 行)には存在しない 7 行目(ggg)が含まれている(元 Wiki の記載どおり)。
- 元 Wiki の「戻る」の並びで Pandas が HTML 実体参照(
Pandas)で 書かれていたが、PukiWiki のページ内リンク自動生成を避けるための記法と 思われるため、通常の文字列に戻した。- 同名の見出し(「生成」「アクセス」「インデックス」「抽出」「コピー」「NumPyから」)が 複数あり、GitHub Wiki ではアンカが衝突するため、括弧で文脈を補って一意にした。
- 添付 2 点は、元 Wiki では本文から参照されていなかったが、 CSV / Excel 読込のサンプル・データと思われるため、
DNET_Pandas_temp.csv/DNET_Pandas_temp.xlsxとして取得し、当該節から参照した。
Tags: 移行, Pandas, Python, DataFrame, Series, データ解析, 集計, One-Hot, NumPy
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。