【Python】 Pandas ~ データ集計編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/10/22/014957
https://dk521123.hatenablog.com/entry/2020/10/14/000000

の続き。
Pandas のデータフレームでちょっとした集計する実装にも
かなり便利なので、メモする

目次

【1】データ集計
【2】Tips
 1)List => DataFrame への変換
 2)groupby & sum による集計
 3)DataFrame => JSON(文字列) への変換
 [補足] to_json の使用上の注意

【1】サンプル

import pandas as pd
import json

# 統計情報リスト
statistical_info_list = []
statistical_info_list.append({"date": "2021-04-01", "customer_number": 1})
statistical_info_list.append({"date": "2021-03-01", "customer_number": 2})
statistical_info_list.append({"date": "2021-04-01", "customer_number": 3})
statistical_info_list.append({"date": "2021-02-01", "customer_number": 4})
statistical_info_list.append({"date": "2021-04-01", "customer_number": 5})
statistical_info_list.append({"date": "2021-01-01", "customer_number": 6})
statistical_info_list.append({"date": "2021-04-01", "customer_number": 7})
statistical_info_list.append({"date": "2021-02-01", "customer_number": 8})
statistical_info_list.append({"date": "2021-01-01", "customer_number": 9})
statistical_info_list.append({"date": "2021-02-01", "customer_number": 1})

# Tips 1)List => DataFrame への変換
df = pd.DataFrame(statistical_info_list)

# Tips 2)groupby & sum による集計
df = df.groupby(['date'], as_index=False).sum()

# Tips 3)DataFrame => JSON(文字列) への変換
for result in json.loads(df.to_json(orient='records')):
  print(result)

出力結果

{'date': '2021-01-01', 'customer_number': 15}
{'date': '2021-02-01', 'customer_number': 13}
{'date': '2021-03-01', 'customer_number': 2}
{'date': '2021-04-01', 'customer_number': 16}

【2】Tips

1)List => DataFrame への変換

df = pd.DataFrame(statistical_info_list)

別例

import pandas as pd

header_list = ['id', 'last_name', 'first_name', 'city']
body_list = [
  ["1", "Bloggs", "Joe", "Dublin"],
  ["3", "J\\", "Mike", "Tokyo"],
  ["6", "A-///\\\\\\///\\\\\\", "Smith", "Osaka, \\Japan"],
]

# data / columns で指定する
data_frame = pd.DataFrame(data=body_list, columns=header_list)
print(data_frame)

2)groupby & sum による集計

df = df.groupby(['date'], as_index=False).sum()

# 今回は、分かりやすいように、
# Groupキーは1つ(’date’)しか扱わなかったが
# 複数指定することも可能(['date', 'name', ...]みたいな)

3)DataFrame => JSON(文字列) への変換

json_str = df.to_json(orient='records')

# orient='records' => [{column -> value}, ... , {column -> value}]
# 他の詳細は、以下のサイトを参照のこと

https://note.nkmk.me/python-pandas-to-json/

[補足] to_json の使用上の注意

# df.to_json の戻り値は、文字列なので、
# for などでループさせるには
# 以下のようにする必要がある
json_data = json.loads(json_str)

# ★ 今回のケースだと、to_dict() を使えばいい ★
for result in df.to_dict(orient='records'):
  print(result)

関連記事

Pandas ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957
Pandas ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/10/14/000000
Pandas ~ 基本編 / CSV編 ~
https://dk521123.hatenablog.com/entry/2020/11/17/000000
Pandas ~ 基本編 / Excel編 ~
https://dk521123.hatenablog.com/entry/2020/11/18/000000
Pandas ~ 基本編 / Excel => CSVに変換 ~
https://dk521123.hatenablog.com/entry/2021/01/25/000000
Pandas ~ 基本編 / データのクレンジング ~
https://dk521123.hatenablog.com/entry/2020/04/06/235555
Pandas ~ apply / transform ~
https://dk521123.hatenablog.com/entry/2021/07/27/000000
Pandas ~ to_xxxx / 出力編 ~
https://dk521123.hatenablog.com/entry/2021/04/10/192752
Pandas の環境設定でのトラブル
https://dk521123.hatenablog.com/entry/2021/03/19/000000