【Python】Pandas ~ 基本編 / データフレーム ~

■ はじめに

データフレームに関する基本的な操作をまとめておく。

目次

【1】データフレームを生成する
 例1:List による生成
 例2:dict による生成
【2】データをループする
 例1:itertuples() を使う
 例2:iterrows() を使う
 例3:dict にしてからループ
【3】データをフィルタリングする
 使用上の注意
 例1:df = df[df['xxx'] == '条件']
 例2:query() を利用する
【4】データをソートする
【5】データ型でのフィルタリング
 例1:オブジェクト型のみ抽出する

【1】データフレームを生成する

例1:List による生成

import pandas as pd

data_parts = [
  [1, 2, 3, 4, 5],
  [11, 12, 13, 14, 15],
  [21, 22, 23, 24, 25],
]
data_frame = pd.DataFrame(data_parts, columns=["val1","val2","val3","val4","val15"])
print(data_frame)

出力結果

   val1  val2  val3  val4  val15
0     1     2     3     4      5
1    11    12    13    14     15
2    21    22    23    24     25

例2:dict による生成

import pandas as pd

data_frame = pd.DataFrame({
  'A': [1, 2, 3],
  'B': [4, 5, 6],
  'C': [7, 8, 9]
})

print(data_frame)

print('*************')

list = [
  {'item1': 1, 'item2': 2, 'item3': 3},
  {'item1': 4, 'item2': 5, 'item3': 6},
  {'item1': 7, 'item2': 8, 'item3': 9}
]
df = pd.DataFrame(list)
print(df)

出力結果

   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
*************
   item1  item2  item3
0      1      2      3
1      4      5      6
2      7      8      9

【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/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
NumPy ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532
Python 3 エンジニア認定データ分析試験
https://dk521123.hatenablog.com/entry/2020/12/12/000000