SlideShare a Scribd company logo
最初はExcelでいけると思ってたけど途中か
らしんどくなってきたデータのための
Python Pandas (複数インデックス編)
入力:4人の位置座標(x, y)を追跡したデータ
出力:個人間の距離と方角の時系列情報
本日のゴール
a.csv b.csv
c.csv d.csv
本日のゴール
Aさん、Bさん、Cさん、Dさんの位置(x, y)の個別比較
A市、B市、C市、D市の気温・湿度(temp, humid)の日毎比較
A社、B社、C社、D市の売上・粗利(sales, gp)の月毎比較
応用例
参考: 他のアプローチだと…
・平均値 (Aave, Bave, Cave, Dave)等の統計量を比較
・相関係数(rAB, rAC, rAD, rBC, rBD ,rCD)を算出
時間変化が丸められてしまう
課題
時間×対象×測値 の3次元データを扱うことになる
=画面に収まらない
GUIには荷が重い
扱うデータ(基本の形)
第1カラム: 時刻情報
例) 動画上のフレーム番号、日付、時刻
第2カラム以降: そのときのデータ
例) x, y座標、気温, 湿度、売上, 粗利
データの追加 1
カラムを増やす方針
→横スクロールしまくる羽目になる
データの追加 2
シートを増やす方針
→シートを切り替えまくる羽目になる
データの追加 3
インデックスを増やす方針
→Excelのピボットテーブルを覚える羽目になる
csv
Pythonに(一時的に)乗り換えよう
Windows10 (Excelは入ってなくてもよい)
AnacondaでPython3をインストール
pipでnumpyとpandasをインストール
前提とする環境
pd: pandas
np: numpy
df: DataFrame
src: source
dst: destination
tar: target
ここからはコピペで使えるサンプルをひたすら紹介
凡例
CSVの連結
a.csv b.csv
c.csv d.csv
abcd.csv
import pandas as pd
print('4つのデータを読み込み')
a_df = pd.read_csv('./a.csv')
b_df = pd.read_csv('./b.csv')
c_df = pd.read_csv('./c.csv')
d_df = pd.read_csv('./d.csv')
print(a_df)
print(b_df)
print(c_df)
print(d_df)
…続く
a.csv b.csv
c.csv d.csv
…続き
print('memberカラムにABCDを追加してデータを連結')
a_df = a_df.assign(member='A')
b_df = b_df.assign(member='B')
c_df = c_df.assign(member='C')
d_df = d_df.assign(member='D')
dst_df = pd.concat([a_df, b_df, c_df, d_df])
print(dst_df)
print('インデックスを設定してインデックスでソート')
dst_df = dst_df.set_index(['frame', 'member'])
dst_df = dst_df.sort_index(ascending=True)
print(dst_df)
dst_df.to_csv('./abcd.csv')
データの取り出し
import pandas as pd
src_df = pd.read_csv('./abcd.csv')
src_df = src_df.set_index(['frame', 'member'])
print('3フレーム目のデータだけ取り出す')
dst_df = src_df.xs([3], level=[0])
print(dst_df)
print('Aのデータだけ取り出す')
dst_df = src_df.xs(['A'], level=[1])
print(dst_df)
print('2-4フレーム目のデータだけ取り出す')
dst_df = src_df.loc[pd.IndexSlice[2:4, :], :]
print(dst_df)
print('BとCのデータだけ取り出す')
dst_df = src_df.loc[pd.IndexSlice[:, 'B':'C'], :]
print(dst_df)
level0 level1
付き合わせ用データフレームの作成
import pandas as pd
import itertools
src_df = pd.read_csv('./abcd.csv')
src_df = src_df.set_index(['frame', 'member'])
print('組み合わせ(正確には順列)の生成')
member_list = list(src_df.index.levels[1].unique())
permu = list(itertools.permutations(member_list, 2))
…続く
('A', 'B')
('A', 'C')
('A', 'D')
('B', 'A')
('B', 'C')
('B', 'D')
('C', 'A')
('C', 'B')
('C', 'D')
('D', 'A')
('D', 'B')
('D', 'C')
['A', 'B', 'C', 'D']
…続き
print('突き合わせ用データフレームの作成')
dst_df = pd.DataFrame()
for p in permu:
from_df = src_df.xs([p[0]], level=[1])
to_df = src_df.xs([p[1]], level=[1])
permu_df = pd.DataFrame()
permu_df = permu_df.assign(
from_x = from_df['x'],
from_y = from_df['y'],
to_x = to_df['x'],
to_y = to_df['y']
)
permu_df = permu_df.assign(
from_member = p[0],
to_member = p[1]
).reset_index().set_index(['frame', 'from_member', 'to_member'])
dst_df = pd.concat([dst_df, permu_df])
dst_df = dst_df.sort_index(ascending=True)
dst_df.to_csv('./permu.csv')
import pandas as pd
import numpy as np
import math
src_df = pd.read_csv('./permu.csv')
src_df = src_df.set_index(['frame', 'from_member', 'to_member'])
print('2点間距離と(絶対)角度を追加')
x_diff_df = src_df['from_x'] - src_df['to_x']
y_diff_df = src_df['from_y'] - src_df['to_y']
distance_df = np.sqrt(x_diff_df**2 + y_diff_df**2)
angle_df = (np.arctan2(y_diff_df, x_diff_df).apply(math.degrees) + 360) % 360
dst_df = src_df.assign(
distance = distance_df,
theta = angle_df
)
print(dst_df)
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)

More Related Content

PDF
CuPyでAx=bを解きたかった話
PDF
Incanterの紹介
PDF
Path Decompositionを用いたメモリ効率の良い動的キーワード辞書の実装法(ポスター)
PPTX
R -> Python
PDF
Intoroduction of Pandas with Python
PDF
Python for Data Anaysis第2回勉強会4,5章
PPTX
東大生向けデータ解析講座 第2回 2017/12/29
CuPyでAx=bを解きたかった話
Incanterの紹介
Path Decompositionを用いたメモリ効率の良い動的キーワード辞書の実装法(ポスター)
R -> Python
Intoroduction of Pandas with Python
Python for Data Anaysis第2回勉強会4,5章
東大生向けデータ解析講座 第2回 2017/12/29

Similar to 最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編) (7)

PDF
Pandas presentation
PDF
2kaime
PDF
dplyr と purrrを用いたデータハンドリング
PPTX
PandasとSQLとの比較
PPTX
Python for Data Analysis: Chapter 2
PDF
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
PDF
Introduction to NumPy & SciPy
Pandas presentation
2kaime
dplyr と purrrを用いたデータハンドリング
PandasとSQLとの比較
Python for Data Analysis: Chapter 2
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Introduction to NumPy & SciPy
Ad

More from Study Group by SciencePark Corp. (20)

PPTX
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
PPTX
YOLOとご一緒にPandasはいかがですか
PPTX
新入社員の俺がDeepLearningのコードを書いてみたら神検出率だった件
PPTX
.NET CoreでのWindowsサービスの作り方と、Coreならではの便利な機能
PPTX
ドライバへのETWの埋め込み
PPTX
JTAGを使ってみよう
PPTX
初心者向けデバイスドライバ講座(6)
PPTX
ローカルストレージでの永続化キューの方式を本気で比較してみた
PPTX
Azure VMを検証に使う - 便利なHyper-Vスナップショットを使う方法
PPTX
02.超初心者向けセキュリティ入門(IoT)
PPTX
06.超初心者向けセキュリティ入門(.netの解析と対策)
PPTX
Visual StudioでWixをビルドしてみた
PPTX
MacOS10.15への対応について
PPTX
Teamsでのリモート勉強会の開き方
PPTX
リモートでの勉強会参加方法
PPTX
初心者向けデバイスドライバ講座 (2)
PPTX
No.2 超初心者向け セキュリティ入門
PPTX
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
PPTX
初心者向けデバイスドライバ講座(1)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
YOLOとご一緒にPandasはいかがですか
新入社員の俺がDeepLearningのコードを書いてみたら神検出率だった件
.NET CoreでのWindowsサービスの作り方と、Coreならではの便利な機能
ドライバへのETWの埋め込み
JTAGを使ってみよう
初心者向けデバイスドライバ講座(6)
ローカルストレージでの永続化キューの方式を本気で比較してみた
Azure VMを検証に使う - 便利なHyper-Vスナップショットを使う方法
02.超初心者向けセキュリティ入門(IoT)
06.超初心者向けセキュリティ入門(.netの解析と対策)
Visual StudioでWixをビルドしてみた
MacOS10.15への対応について
Teamsでのリモート勉強会の開き方
リモートでの勉強会参加方法
初心者向けデバイスドライバ講座 (2)
No.2 超初心者向け セキュリティ入門
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
初心者向けデバイスドライバ講座(1)
Ad

最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)