■ はじめに
データフレームに関する基本的な操作をまとめておく。
目次
【1】データフレームを生成する 【2】データをループする 例1:itertuples() を使う 例2:iterrows() を使う 例3:dict にしてからループ 【3】データをフィルタリングする 使用上の注意 例1:df = df[df['xxx'] == '条件'] 例2:query() を利用する 【4】データをソートする 【5】データ型でのフィルタリング 例1:オブジェクト型のみ抽出する
【1】データフレームを生成する
* 以下の関連記事を参照のこと。
Pandas ~ データフレームの相互変換 ~
https://dk521123.hatenablog.com/entry/2022/02/15/000000
【2】データをループする
https://note.nkmk.me/python-pandas-dataframe-for-iteration/
がよくまとまっている。 * 例1の itertuples()の方が、例2の iterrows() を使うより高速らしい * 例3の dict 化については、以下の関連記事も参考になる
https://dk521123.hatenablog.com/entry/2021/04/10/192752
使用上の注意
* 例1の itertuples() と 例2の iterrows() で値の取り方が違う + itertuples() の場合、row.xxxx <= クラスのプロパティとして取る + iterrows() の場合、row['xxxx'] <= dict として取る
例1:itertuples() を使う
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] }) for row in df.itertuples(): print(f"{row.A} / {row.B} / {row.C}")
出力結果
1 / 4 / 7 2 / 5 / 8 3 / 6 / 9
例2:iterrows() を使う
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] }) for index, row in df.iterrows(): print(f"{index} - {row['A']} / {row['B']} /{row['C']}")
出力結果
0 - 1 / 4 /7 1 - 2 / 5 /8 2 - 3 / 6 /9
例2:dict にしてからループ
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] }) data_dict = df.to_dict(orient='dict') for key, value in data_dict.items(): print(f"{key} - {value}")
出力結果
A - {0: 1, 1: 2, 2: 3} B - {0: 4, 1: 5, 2: 6} C - {0: 7, 1: 8, 2: 9}
【3】データをフィルタリングする
使用上の注意
* 例1のように、複数条件で絞り込む場合、以下の点に注意すること 1)&、|、~を使う(and、or、notだとエラー) 2)条件ごとに括弧で囲む(括弧がないとエラー)
https://note.nkmk.me/python-pandas-multiple-conditions/
例1:df = df[df['xxx'] == '条件']
import pandas as pd list = [ {'id': 1, 'name': 'Mike', 'age': 23}, {'id': 2, 'name': 'Tom', 'age': 36}, {'id': 3, 'name': 'Kevin', 'age': 49}, {'id': 4, 'name': 'Sam', 'age': 19}, {'id': 5, 'name': 'Smith', 'age': 51} ] df = pd.DataFrame(list) under_25_df = df[df['age'] <= 25] print(under_25_df) print('************') from_20_to_49_df = df[(df['age'] >= 20) & (df['age'] <= 49)] print(from_20_to_49_df)
出力結果
id name age 0 1 Mike 23 3 4 Sam 19 ************ id name age 0 1 Mike 23 1 2 Tom 36 2 3 Kevin 49
例2:query() を利用する
import pandas as pd list = [ {'id': 1, 'name': 'Mike', 'age': 23}, {'id': 2, 'name': 'Tom', 'age': 36}, {'id': 3, 'name': 'Kevin', 'age': 49}, {'id': 4, 'name': 'Sam', 'age': 19}, {'id': 5, 'name': 'Smith', 'age': 51} ] df = pd.DataFrame(list) print(df.query('id % 2 == 0'))
出力結果
id name age 1 2 Tom 36 3 4 Sam 19
参考文献
https://note.nkmk.me/python-pandas-query/
https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA
【4】データをソートする
* sort_values(by, ascending)
例1:値を設定する
import pandas as pd list = [ {'id': 1, 'name': 'Mike', 'age': 23}, {'id': 2, 'name': 'Tom', 'age': 36}, {'id': 3, 'name': 'Kevin', 'age': 49}, {'id': 4, 'name': 'Sam', 'age': 19}, {'id': 5, 'name': 'Smith', 'age': 51} ] df = pd.DataFrame(list) print(df.sort_values(by='age', ascending=True)) print("****************") print(df.sort_values(by='age', ascending=False))
出力結果
id name age 3 4 Sam 19 0 1 Mike 23 1 2 Tom 36 2 3 Kevin 49 4 5 Smith 51 **************** id name age 4 5 Smith 51 2 3 Kevin 49 1 2 Tom 36 0 1 Mike 23 3 4 Sam 19
参考文献
https://note.nkmk.me/python-pandas-sort-values-sort-index/
【5】データ型でのフィルタリング
* select_dtypes を使う
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.select_dtypes.html
例1:オブジェクト型のみ抽出する
import pandas as pd df = pd.DataFrame({ 'a': [1, 2, 3, 4], 'b': [0.1, 2.3, 4.5, 6.7], 'c': ['A', 'B', 'C', 'D'], 'd': [[0, 0], [0, 1], [1, 0], [1, 1]], 'e': [True, False, False, True], 'f': ['2018-01-01', '2019-02-23', '2020-03-08', '2021-04-15'] }) print(df.dtypes) print('***********') print(df.select_dtypes(include=object))
出力結果
a int64 b float64 c object d object e bool f object dtype: object *********** c d f 0 A [0, 0] 2018-01-01 1 B [0, 1] 2019-02-23 2 C [1, 0] 2020-03-08 3 D [1, 1] 2021-04-15
関連記事
Pandas ~入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957
Pandas ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/10/14/000000
Pandas ~ データフレームの相互変換 ~
https://dk521123.hatenablog.com/entry/2022/02/15/000000
Pandas ~ 基本編 / データのクレンジング ~
https://dk521123.hatenablog.com/entry/2020/04/06/235555
Pandas ~ データ集計編 ~
https://dk521123.hatenablog.com/entry/2021/04/07/105858
Python ~ 基本編 / CSV ~
https://dk521123.hatenablog.com/entry/2019/11/07/214108
Pandas ~ NaNをNoneに変換する ~
https://dk521123.hatenablog.com/entry/2022/02/20/000000
NumPy ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532
Python 3 エンジニア認定データ分析試験
https://dk521123.hatenablog.com/entry/2020/12/12/000000