Pandas

pandas入門

・Pandas入門

今現在、プロジェクトでPythonのライブラリ「Pandas」を使っているので、覚書も含め纏めたいと思います。 不備などありましたら、ご指摘をお願い致します。

・Pandasとは

Pandasとはデータ解析、操作を迅速で快適かつ簡単に行なうことができるPythonで作られたオープンソースライブラリになります。 開発者であるWes McKinneyは、財務データを定量分析するための高性能で柔軟なツールを欲しており、AQR Capital Managementにて2008年にpandasの開発を開始した。 AQRを去る前に上司を説得し、ライブラリの一般公開が可能となった。 別のAQR従業員であるChang Sheは、2012年からこのライブラリの2番目の主要コントリビューターとなった。同時期に、Pythonコミュニティでライブラリが普及し、さらに多くのコントリビューターがプロジェクトに加わることになった。 2015年、pandasはNumFOCUS(アメリカ合衆国における501(c)(3)非営利慈善団体)の財政出資プロジェクトとして署名した。

・Pandasのインストール

pip install pandas

・使い方 Pandasを利用するには通例、以下のようにPandasライブラリを読み込みます。

import pandas as pd

・Pandasのデータ構造

Pandasでは1次元配列のSeries、2次元配列のDataframe、3次元配列のPanelが用意されています。 今回はよく利用するSeries、Dataframeについてまとめていきます。

・Series生成 Seriesの生成は以下のようになります。

pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

各パラメータの説明


引数 内容
・data データ:配列相当のもの、ディクショナリ、数値
データがディクショナリの場合には引数の順序は維持されます。
・index データ:配列相当のもの、または1次元配列のインデックス。
デフォルトとしてRangeIndexが0から1, 2, …, nの順番で設定される。ディクショナリ相当のデータでインデックスが指定されていない場合、キーがインデックスとして使用される。
・dtype データ:str型、numpy.dtype、ExtensionDtype
出力されるSeriesのデータ型を指定したい場合に設定。Noneの場合は型推論で指定される。
・name データ:str型
Seriesの列名を設定
・copy データ:bool型 デフォルト:False
入力されたデータの参照を利用するか、コピーを利用するかを指定。

pd.Series(["name1","name2","name3"])

index col1
0 name1
1 name2
2 name3

dtype: object

・DataFrame生成 DataFrameの生成は以下のようになります。

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=None)

20211025105652-00000388-.png

各パラメータの説明

引数 内容
・data データ:ndarray、Iterable、ディクショナリ、DataFrame
ディクショナリにはSeries、配列、定数、dataclass、リスト相当のオブジェクトを含めれます。データがディクショナリの場合、列の順番は挿入の順番に準拠します。
・index データ:インデックスまたは配列相当のもの
インデックスを配列などで指定。インデックスを指定していない場合は、デフォルトとしてRangeIndexが0から1, 2, …, nの順番で設定される。
・columns データ:インデックスまたは配列相当のもの
データにカラム名がない場合、結果にカラム名を設定。デフォルトとしてRangeIndexが0から1, 2, …, nの順番で設定される。
・dtype データ:dtype デフォルト None
出力されるDataframeのデータ型を指定したい場合に設定。Noneの場合は型推論で指定される。
・copy データ:bool型 デフォルト:None
入力データのコピー。
ディクショナリのデフォルトの設定はNoneでcopy=Trueの振る舞いをする。データフレーム、二次元配列のデータのデフォルトの設定はNoneでcopy=Falseの振る舞いをする。version 1.3.0.で変更されているようです。

data_list = [["name1", "address1", "M", pd.Timestamp("20000101"), 170.0, 60.0],["name2", "address2", "F", pd.Timestamp("20000102"), 160.0, 50.0],["name3", "address3", "M", pd.Timestamp("20000103"), 180.0, 70.0]]

df = pd.DataFrame(data_list, columns=["col1", "col2", "col3", "col4", "col5", "col6"])

index col1 col2 col3 col4 col5 col6
0 name1 address1 M 2000-01-01 170.0 60.0
1 name2 address2 F 2000-01-02 160.0 50.0
2 name3 address3 M 2000-01-03 180.0 70.0

・列データの追加

new_data_list = [1,2,1] df["col7"] = new_data_list

index col1 col2 col3 col4 col5 col6 col7
0 name1 address1 M 2000-01-01 170.0 60.0 1
1 name2 address2 F 2000-01-02 160.0 50.0 2
2 name3 address3 M 2000-01-03 180.0 70.0 1

## 要素の選択 列を指定した取得方法(二つは同一結果)

df["col1"]

index col1
0 name1
1 name2
2 name3

Name: col1, dtype: object

df.col1

index col1
0 name1
1 name2
2 name3

Name: col1, dtype: object

行を指定した取得方法

df[0:2]

index col1 col2 col3 col4 col5 col6 0 name1 address1 M 2000-01-01 170.0 60.0 1 name2 address2 F 2000-01-02 160.0 50.0

数値で位置を指定した行の取得方法

df.iloc[2]

Name Value
col1 name3
col2 address3
col3 M
col4 2000-01-0300:00:00
col5 180
col6 70

Name: 2, dtype: object

行および列を数値位置で指定しての取得方法。

df.iloc[[0, 2], [0, 2]]

index col1 col3
0 name1 M
2 name3 M

行を指定しての取得方法

df.iloc[[0,2], :]

index col1 col2 col3 col4 col5 col6
0 name1 address1 M 2000-01-01 170.0 60.0
2 name3 address3 M 2000-01-03 180.0 70.0

Boolean indexing

df[df["col5"] > 160]

index col1 col2 col3 col4 col5 col6
0 name1 address1 M 2000-01-01 170.0 60.0

df[df["col6"].isin([50.0, 70.0])]

index col1 col2 col3 col4 col5 col6
1 name2 address2 F 2000-01-02 160.0 50.0
2 name3 address3 M 2000-01-03 180.0 70.0

・グループ化

データ

data_list = [["name1", "address1", "M", pd.Timestamp("20000101"), 170.0, 60.0,1],["name2", "address2", "F", pd.Timestamp("20000102"), 160.0, 50.0,2],["name3", "address3", "M", pd.Timestamp("20000103"), 180.0, 70.0,1],["name4", "address4", "F", pd.Timestamp("20000104"), 150.0, 40.0,1],["name5", "address5", "M", pd.Timestamp("20000105"), 190.0, 80.0,2],["name6", "address6", "M", pd.Timestamp("20000106"), 200.0, 90.0,1],["name7", "address7", "F", pd.Timestamp("20000107"), 140.0, 40.0,1],["name8", "address8", "F", pd.Timestamp("20000108"), 150.0, 50.0,2],["name9", "address9", "F", pd.Timestamp("20000109"), 170.0, 60.0,1],["name10", "address10", "M", pd.Timestamp("20000110"), 170.0, 60.0,2]] df = pd.DataFrame(data_list, columns=["col1", "col2", "col3", "col4", "col5", "col6", "col7"])

index col1 col2 col3 col4 col5 col6 col7
0 name1 address1 M 2000-01-01 170.0 60.0 1
1 name2 address2 F 2000-01-02 160.0 50.0 2
2 name3 address3 M 2000-01-03 180.0 70.0 1
3 name4 address4 F 2000-01-04 150.0 40.0 1
4 name5 address5 M 2000-01-05 190.0 80.0 2
5 name6 address6 M 2000-01-06 200.0 90.0 1
6 name7 address7 F 2000-01-07 140.0 40.0 1
7 name8 address8 F 2000-01-08 150.0 50.0 2
8 name9 address9 F 2000-01-09 170.0 60.0 1
9 name10 address10 M 2000-01-10 170.0 60.0 2

列を指定してグループ化した結果を取得する方法。

gp_df = df.groupby("col3") df.loc[gp_df['col5'].idxmax(),:]

index col1 col2 col3 col4 col5 col6 col7
8 name9 address9 F 2000-01-09 170.0 60.0 1
5 name6 address6 M 2000-01-06 200.0 90.0 1

複数列を指定してグループ化した結果を取得する方法。

gp_df = df.groupby(["col3","col7"]) df.loc[gp_df['col5'].idxmax(),:]

index col1 col2 col3 col4 col5 col6 col7
8 name9 address9 F 2000-01-09 170.0 60.0 1
1 name2 address2 F 2000-01-02 160.0 50.0 2
5 name6 address6 M 2000-01-06 200.0 90.0 1
4 name5 address5 M 2000-01-05 190.0 80.0 2

・マージ処理

concat 縦方向に単純に結合する方法。

データ1

data_list = [["101","name1", "address1", "M", pd.Timestamp("20000101"), 170.0, 60.0,1],["102","name2", "address2", "F", pd.Timestamp("20000102"), 160.0, 50.0,2],["103","name3", "address3", "M", pd.Timestamp("20000103"), 180.0, 70.0,1],["104","name4", "address4", "F", pd.Timestamp("20000104"), 150.0, 40.0,1],["105","name5", "address5", "M", pd.Timestamp("20000105"), 190.0, 80.0,2]] df = pd.DataFrame(data_list, columns=["ID","col1", "col2", "col3", "col4", "col5", "col6", "col7"])

index ID col1 col2 col3 col4 col5 col6 col7
0 101 name1 address1 M 2000-01-01 170.0 60.0 1
1 102 name2 address2 F 2000-01-02 160.0 50.0 2
2 103 name3 address3 M 2000-01-03 180.0 70.0 1
3 104 name4 address4 F 2000-01-04 150.0 40.0 1
4 105 name5 address5 M 2000-01-05 190.0 80.0 2

データ2

data_list2 = [["106","name6", "address6", "M", pd.Timestamp("20000106"), 200.0, 90.0,1],["107","name7", "address7", "F", pd.Timestamp("20000107"), 140.0, 40.0,1],["108","name8", "address8", "F", pd.Timestamp("20000108"), 150.0, 50.0,2],["109","name9", "address9", "F", pd.Timestamp("20000109"), 170.0, 60.0,1],["110","name10", "address10", "M", pd.Timestamp("20000110"), 170.0, 60.0,2]] df2 = pd.DataFrame(data_list2, columns=["ID","col1", "col2", "col3", "col4", "col5", "col6", "col7"])

index ID col1 col2 col3 col4 col5 col6 col7
0 106 name6 address6 M 2000-01-06 200.0 90.0 1
1 107 name7 address7 F 2000-01-07 140.0 40.0 1
2 108 name8 address8 F 2000-01-08 150.0 50.0 2
3 109 name9 address9 F 2000-01-09 170.0 60.0 1
4 110 name10 address10 M 2000-01-10 170.0 60.0 2

結合結果

pd.concat([df,df2],ignore_index=True)

index ID col1 col2 col3 col4 col5 col6 col7
0 101 name1 address1 M 2000-01-01 170.0 60.0 1
1 102 name2 address2 F 2000-01-02 160.0 50.0 2
2 103 name3 address3 M 2000-01-03 180.0 70.0 1
3 104 name4 address4 F 2000-01-04 150.0 40.0 1
4 105 name5 address5 M 2000-01-05 190.0 80.0 2
5 106 name6 address6 M 2000-01-06 200.0 90.0 1
6 107 name7 address7 F 2000-01-07 140.0 40.0 1
7 108 name8 address8 F 2000-01-08 150.0 50.0 2
8 109 name9 address9 F 2000-01-09 170.0 60.0 1
9 110 name10 address10 M 2000-01-10 170.0 60.0 2

merge 横方向に結合する方法。

データ3

data_list = [["101","name1", "address1", "M", pd.Timestamp("20000101"), 170.0, 60.0,1],["102","name2", "address2", "F", pd.Timestamp("20000102"), 160.0, 50.0,2],["104","name4", "address4", "F", pd.Timestamp("20000104"), 150.0, 40.0,1],["105","name5", "address5", "M", pd.Timestamp("20000105"), 190.0, 80.0,2],["106","name6", "address6", "M", pd.Timestamp("20000106"), 200.0, 90.0,1],["107","name7", "address7", "F", pd.Timestamp("20000107"), 140.0, 40.0,1],["110","name10", "address10", "M", pd.Timestamp("20000110"), 170.0, 60.0,2]] df = pd.DataFrame(data_list, columns=["ID","col1", "col2", "col3", "col4", "col5", "col6", "col7"])

index ID col1 col2 col3 col4 col5 col6 col7
0 101 name1 address1 M 2000-01-01 170.0 60.0 1
1 102 name2 address2 F 2000-01-02 160.0 50.0 2
2 104 name4 address4 F 2000-01-04 150.0 40.0 1
3 105 name5 address5 M 2000-01-05 190.0 80.0 2
4 106 name6 address6 M 2000-01-06 200.0 90.0 1
5 107 name7 address7 F 2000-01-07 140.0 40.0 1
6 110 name10 address10 M 2000-01-10 170.0 60.0 2

データ4

data_list2 = [["101",100,10,50],["102",90,20,60],["103",80,30,70],["105",60,50,90],["106",50,60,100],["108",30,80,20],["109",20,90,30]] df2 = pd.DataFrame(data_list2, columns=["ID","science","english","math"])

index ID science english math
0 101 100 10 50
1 102 90 20 60
2 103 80 30 70
3 105 60 50 90
4 106 50 60 100
5 108 30 80 20
6 109 20 90 30

INNER JOINでの結合方法

pd.merge(df,df2,how="inner",on="ID")

結合結果

index ID col1 col2 col3 col4 col5 col6 col7 science english math
0 101 name1 address1 M 2000-01-01 170.0 60.0 1 100 10 50
1 102 name2 address2 F 2000-01-02 160.0 50.0 2 90 20 60
2 105 name5 address5 M 2000-01-05 190.0 80.0 2 60 50 90
3 106 name6 address6 M 2000-01-06 200.0 90.0 1 50 60 100

LEFT JOINでの結合方法

pd.merge(df,df2,how="left",on="ID")

結合結果

index ID col1 col2 col3 col4 col5 col6 col7 science english math
0 101 name1 address1 M 2000-01-01 170.0 60.0 1 100.0 10.0 50.0
1 102 name2 address2 F 2000-01-02 160.0 50.0 2 90.0 20.0 60.0
2 104 name4 address4 F 2000-01-04 150.0 40.0 1 NaN NaN NaN
3 105 name5 address5 M 2000-01-05 190.0 80.0 2 60.0 50.0 90.0
4 106 name6 address6 M 2000-01-06 200.0 90.0 1 50.0 60.0 100.0
5 107 name7 address7 F 2000-01-07 140.0 40.0 1 NaN NaN NaN
6 110 name10 address10 M2000-01-10 170.0 60.0 2 NaN NaN NaN

RIGHT JOINでの結合方法

pd.merge(df,df2,how="right",on="ID")

結合結果

index col1 col2 col3 col4 col5 col6 col7 science english math
0 101 name1 address1 M 2000-01-01 170.0 60.0 1.0 100 10
1 102 name2 address2 F 2000-01-02 160.0 50.0 2.0 90 20
2 105 name5 address5 M 2000-01-05 190.0 80.0 2.0 60 50
3 106 name6 address6 M 2000-01-06 200.0 90.0 1.0 50 60
4 103 NaN NaN NaN NaT NaN NaN NaN 80 30
5 108 NaN NaN NaN NaT NaN NaN NaN 30 80
6 109 NaN NaN NaN NaT NaN NaN NaN 20 90

・データの入出力

CSVデータの入出力方法

df.to_csv("foo.csv") pd.read_csv("foo.csv")

Excelデータの入出力方法

df.to_excel("foo.xlsx", sheet_name="Sheet1") pd.read_excel("foo.xlsx", "Sheet1", index_col=None, na_values=["NA"])

・まとめ

基本的なpandasの使い方をまとめました。 pandasは他にも色々便利な機能も用意されているので、今後利用した際にまとめたいと思います。

추가 이미지




댓글

댓글 추가

user-symbol

문의하기

비즈니스 개발자를 위한 최신 정보를 원하십니까? 소스 코드 프로젝트에 대한 PieceX 커뮤니티의 요구사항을 알아보세요. PieceX의 최신 무료 커뮤니티 코드를 빠르게 알려드립니다.