Edited at

これだけ覚えておけばなんとかなるPandas

More than 3 years have passed since last update.


これは何?

Pandasのチートシートです。ほぼ自分用メモ。最低限の行間を読める人向け。


Pandasチートシート


基本データ操作


各種インポート

import pandas as pd

import matplotlib as matplotlib
import matplotlib.pyplot as plt
from IPython.display import display
%matplotlib inline


データのロード

data = pd.read_csv('https://gist.githubusercontent.com/kojim/0a47ed4258222b0541a42aa9fd7da906/raw/a5d6a1a527deec269697c5b2ddab4157184af4ff/civ4.csv')

data.head(5)




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費




0
0
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
10.0
4.0
4.0
1.0
0.0


1
0
TXT_KEY_LEADER_WANGKON
TXT_KEY_CITY_NAME_SEOUL
0.0
9.0
2.0
4.0
2.0
0.0


2
0
TXT_KEY_LEADER_HAMMURABI
TXT_KEY_CITY_NAME_BABYLON
0.0
9.0
2.0
4.0
1.0
0.0


3
0
TXT_KEY_LEADER_PACAL
TXT_KEY_CITY_NAME_MUTAL
0.0
9.0
2.0
4.0
1.0
0.0


4
0
TXT_KEY_LEADER_SITTING_BULL
TXT_KEY_CITY_NAME_CAHOKIA
0.0
11.0
2.0
4.0
1.0
0.0


行の絞込み(行数)

data.head(3)




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費




0
0
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
10.0
4.0
4.0
1.0
0.0


1
0
TXT_KEY_LEADER_WANGKON
TXT_KEY_CITY_NAME_SEOUL
0.0
9.0
2.0
4.0
2.0
0.0


2
0
TXT_KEY_LEADER_HAMMURABI
TXT_KEY_CITY_NAME_BABYLON
0.0
9.0
2.0
4.0
1.0
0.0


行の絞込み(値)

data.query("指導者 == 'kojim' & 金銭 > 5").head(3)




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費




654
64
kojim
TXT_KEY_CITY_NAME_ATHENS
6.0
4.0
4.0
4.0
11.0
1.0


674
65
kojim
TXT_KEY_CITY_NAME_ATHENS
6.0
4.0
4.0
4.0
11.0
1.0


695
66
kojim
TXT_KEY_CITY_NAME_ATHENS
6.0
4.0
4.0
4.0
11.0
1.0


列の抽出(Seriesの取得)

data['ターン数'].head(3)

0    0

1 0
2 0
Name: ターン数, dtype: int64


列の絞込み

data[['ターン数', '指導者']].head(3)




ターン数
指導者




0
0
kojim


1
0
TXT_KEY_LEADER_WANGKON


2
0
TXT_KEY_LEADER_HAMMURABI


列データの演算

(data['ターン数'] + 10).head(3)

0    10

1 10
2 10
Name: ターン数, dtype: int64


列の追加

data['出力'] = data['研究'] + data['生産']

data.head(3)




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費
出力




0
0
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
10.0
4.0
4.0
1.0
0.0
11.0


1
0
TXT_KEY_LEADER_WANGKON
TXT_KEY_CITY_NAME_SEOUL
0.0
9.0
2.0
4.0
2.0
0.0
11.0


2
0
TXT_KEY_LEADER_HAMMURABI
TXT_KEY_CITY_NAME_BABYLON
0.0
9.0
2.0
4.0
1.0
0.0
10.0


行の連結

data2 = pd.read_csv('https://gist.githubusercontent.com/kojim/0a47ed4258222b0541a42aa9fd7da906/raw/a5d6a1a527deec269697c5b2ddab4157184af4ff/civ4.csv')

data.append(data2, ignore_index=True).head(3)




スパイ
ターン数
出力
指導者
文化
生産
研究
維持費
都市名
金銭




0
4.0
0
11.0
kojim
4.0
1.0
10.0
0.0
TXT_KEY_CITY_NAME_ATHENS
0.0


1
4.0
0
11.0
TXT_KEY_LEADER_WANGKON
2.0
2.0
9.0
0.0
TXT_KEY_CITY_NAME_SEOUL
0.0


2
4.0
0
10.0
TXT_KEY_LEADER_HAMMURABI
2.0
1.0
9.0
0.0
TXT_KEY_CITY_NAME_BABYLON
0.0


列の連結

data3 = pd.DataFrame(

{'都市名': ['TXT_KEY_CITY_NAME_ATHENS'],
'都市名(日本語)': ['アテネ']})
data3




都市名
都市名(日本語)




0
TXT_KEY_CITY_NAME_ATHENS
アテネ

pd.merge(data, data3, on='都市名', how='left').head(3)




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費
出力
都市名(日本語)




0
0
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
10.0
4.0
4.0
1.0
0.0
11.0
アテネ


1
0
TXT_KEY_LEADER_WANGKON
TXT_KEY_CITY_NAME_SEOUL
0.0
9.0
2.0
4.0
2.0
0.0
11.0
NaN


2
0
TXT_KEY_LEADER_HAMMURABI
TXT_KEY_CITY_NAME_BABYLON
0.0
9.0
2.0
4.0
1.0
0.0
10.0
NaN


グルーピング


列の値を使用したグルーピング

data.groupby('指導者').sum()




ターン数
金銭
研究
文化
スパイ
生産
維持費
出力


指導者












TXT_KEY_LEADER_BARBARIAN
18676
369.0
0.0
0.0
0.0
458.0
302.0
458.0


TXT_KEY_LEADER_GILGAMESH
526136
22768.0
57690.0
40047.0
30305.0
32826.0
5139.0
90516.0


TXT_KEY_LEADER_HAMMURABI
276530
4612.0
29905.0
14777.0
10738.0
14424.0
2280.0
44329.0


TXT_KEY_LEADER_PACAL
463715
28303.0
110795.0
46527.0
31253.0
32673.0
5193.0
143468.0


TXT_KEY_LEADER_RAGNAR
459257
26257.0
53257.0
20919.0
21955.0
28830.0
5826.0
82087.0


TXT_KEY_LEADER_SITTING_BULL
284044
12073.0
53986.0
20733.0
24190.0
27457.0
1580.0
81443.0


TXT_KEY_LEADER_WANGKON
356335
13491.0
60699.0
25940.0
25531.0
24785.0
2938.0
85484.0


kojim
469839
32913.0
223011.0
94184.0
31967.0
95515.0
13509.0
318526.0


関数を使用したグルーピング

data.groupby(lambda x: '偶数ターン' if data.ix[x]['ターン数'] % 2 else '奇数ターン').sum()

data.groupby(lambda x: '偶数ターン' if data.ix[x]['ターン数'] % 2 else '奇数ターン').sum()




ターン数
金銭
研究
文化
スパイ
生産
維持費
出力




偶数ターン
1431876
70479.0
295597.0
132280.0
88755.0
128240.0
18415.0
423837.0


奇数ターン
1422656
70307.0
293746.0
130847.0
87184.0
128728.0
18352.0
422474.0


階層グルーピング

g = data.groupby(['指導者', '都市名']).sum()

g.head(10)





ターン数
金銭
研究
文化
スパイ
生産
維持費
出力


指導者
都市名












TXT_KEY_LEADER_BARBARIAN
TXT_KEY_CITY_NAME_KASSITE
5481
41.0
0.0
0.0
0.0
142.0
60.0
142.0


TXT_KEY_CITY_NAME_SAXON
6825
280.0
0.0
0.0
0.0
138.0
121.0
138.0


TXT_KEY_CITY_NAME_YAYOI
6370
48.0
0.0
0.0
0.0
178.0
121.0
178.0


TXT_KEY_LEADER_GILGAMESH
TXT_KEY_CITY_NAME_BAD_TIBIRA
55560
1210.0
2468.0
1009.0
980.0
1938.0
783.0
4406.0


TXT_KEY_CITY_NAME_ERIDU
61035
4153.0
9768.0
5691.0
3768.0
4776.0
423.0
14544.0


TXT_KEY_CITY_NAME_KISH
60291
1319.0
7374.0
4118.0
4591.0
2480.0
508.0
9854.0


TXT_KEY_CITY_NAME_LAGASH
58206
1162.0
1980.0
5989.0
3130.0
3919.0
424.0
5899.0


TXT_KEY_CITY_NAME_NIBRU
51623
1571.0
3397.0
3242.0
1000.0
2347.0
757.0
5744.0


TXT_KEY_CITY_NAME_NIPPUR
32093
215.0
526.0
1243.0
756.0
1836.0
349.0
2362.0


TXT_KEY_CITY_NAME_SAXON
39831
575.0
1984.0
1485.0
1309.0
1133.0
296.0
3117.0

Jupyterの表示上、指導者列は2行しかないように見えるが、表示上そうなっているだけで、実際には行の数、つまり↑の例で言えば10行存在する。以下のようにすることでそれは確認できる。

g.head(10).index.values

array([('TXT_KEY_LEADER_BARBARIAN', 'TXT_KEY_CITY_NAME_KASSITE'),

('TXT_KEY_LEADER_BARBARIAN', 'TXT_KEY_CITY_NAME_SAXON'),
('TXT_KEY_LEADER_BARBARIAN', 'TXT_KEY_CITY_NAME_YAYOI'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_BAD_TIBIRA'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_ERIDU'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_KISH'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_LAGASH'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_NIBRU'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_NIPPUR'),
('TXT_KEY_LEADER_GILGAMESH', 'TXT_KEY_CITY_NAME_SAXON')], dtype=object)


階層グループの階層入れ替え

つまり入れ替えることもできる。

g.swaplevel(0, 1).head(10)





ターン数
金銭
研究
文化
スパイ
生産
維持費
出力


都市名
指導者












TXT_KEY_CITY_NAME_KASSITE
TXT_KEY_LEADER_BARBARIAN
5481
41.0
0.0
0.0
0.0
142.0
60.0
142.0


TXT_KEY_CITY_NAME_SAXON
TXT_KEY_LEADER_BARBARIAN
6825
280.0
0.0
0.0
0.0
138.0
121.0
138.0


TXT_KEY_CITY_NAME_YAYOI
TXT_KEY_LEADER_BARBARIAN
6370
48.0
0.0
0.0
0.0
178.0
121.0
178.0


TXT_KEY_CITY_NAME_BAD_TIBIRA
TXT_KEY_LEADER_GILGAMESH
55560
1210.0
2468.0
1009.0
980.0
1938.0
783.0
4406.0


TXT_KEY_CITY_NAME_ERIDU
TXT_KEY_LEADER_GILGAMESH
61035
4153.0
9768.0
5691.0
3768.0
4776.0
423.0
14544.0


TXT_KEY_CITY_NAME_KISH
TXT_KEY_LEADER_GILGAMESH
60291
1319.0
7374.0
4118.0
4591.0
2480.0
508.0
9854.0


TXT_KEY_CITY_NAME_LAGASH
TXT_KEY_LEADER_GILGAMESH
58206
1162.0
1980.0
5989.0
3130.0
3919.0
424.0
5899.0


TXT_KEY_CITY_NAME_NIBRU
TXT_KEY_LEADER_GILGAMESH
51623
1571.0
3397.0
3242.0
1000.0
2347.0
757.0
5744.0


TXT_KEY_CITY_NAME_NIPPUR
TXT_KEY_LEADER_GILGAMESH
32093
215.0
526.0
1243.0
756.0
1836.0
349.0
2362.0


TXT_KEY_CITY_NAME_SAXON
TXT_KEY_LEADER_GILGAMESH
39831
575.0
1984.0
1485.0
1309.0
1133.0
296.0
3117.0

10 rows × 8 columns



階層グループの再並び替え

入れ替えた後並び替えることもできる。

g.swaplevel(0, 1).sortlevel(0).head(3)





ターン数
金銭
研究
文化
スパイ
生産
維持費
出力


都市名
指導者












TXT_KEY_CITY_NAME_AKKAD
TXT_KEY_LEADER_HAMMURABI
16769
153.0
936.0
744.0
29.0
638.0
287.0
1574.0


TXT_KEY_LEADER_RAGNAR
41110
1631.0
2496.0
776.0
977.0
1782.0
590.0
4278.0


TXT_KEY_LEADER_WANGKON
3492
44.0
55.0
128.0
12.0
144.0
57.0
199.0


階層グループをピボットテーブル形式に再構成する

g2 = g[['出力']].head(3)

g2





出力


指導者
都市名





TXT_KEY_LEADER_BARBARIAN
TXT_KEY_CITY_NAME_KASSITE
142.0


TXT_KEY_CITY_NAME_SAXON
138.0


TXT_KEY_CITY_NAME_YAYOI
178.0

g2.unstack()




出力


都市名
TXT_KEY_CITY_NAME_KASSITE
TXT_KEY_CITY_NAME_SAXON
TXT_KEY_CITY_NAME_YAYOI


指導者







TXT_KEY_LEADER_BARBARIAN
142.0
138.0
178.0


列全体の集計

データの下準備

data3 = data.query("指導者 == 'kojim' & ターン数 > 40 & ターン数 < 50")

data3




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費
出力




299
41
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
12.0
4.0
4.0
8.0
0.0
20.0


311
42
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
10.0
4.0
4.0
11.0
0.0
21.0


323
43
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0


335
44
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0


348
45
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0


361
46
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0


362
46
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0


375
47
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0


376
47
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0


389
48
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0


390
48
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0


403
49
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
8.0
0.0
19.0


404
49
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0

列全体の累積値を計算。

data3['累積出力'] = data['出力'].cumsum()

data3




ターン数
指導者
都市名
金銭
研究
文化
スパイ
生産
維持費
出力
累積出力




299
41
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
12.0
4.0
4.0
8.0
0.0
20.0
3419.0


311
42
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
10.0
4.0
4.0
11.0
0.0
21.0
3545.0


323
43
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0
3666.0


335
44
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0
3786.0


348
45
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0
3908.0


361
46
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0
4031.0


362
46
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0
4034.0


375
47
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0
4164.0


376
47
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0
4167.0


389
48
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
7.0
0.0
18.0
4295.0


390
48
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0
4298.0


403
49
kojim
TXT_KEY_CITY_NAME_ATHENS
0.0
11.0
4.0
4.0
8.0
0.0
19.0
4428.0


404
49
kojim
TXT_KEY_CITY_NAME_SPARTA
0.0
1.0
2.0
0.0
2.0
2.0
3.0
4431.0

列全体の合計値を計算。

data['出力'].sum()


グループごとの再集計

data4 = data.query("指導者 == 'kojim' & ターン数 > 40 & ターン数 < 50").groupby(['都市名', 'ターン数']).sum()

data4

たとえば階層データの特定階層での集計を行いたい場合。





金銭
研究
文化
スパイ
生産
維持費
出力


都市名
ターン数











TXT_KEY_CITY_NAME_ATHENS
41
0.0
12.0
4.0
4.0
8.0
0.0
20.0


42
0.0
10.0
4.0
4.0
11.0
0.0
21.0


43
0.0
11.0
4.0
4.0
7.0
0.0
18.0


44
0.0
11.0
4.0
4.0
7.0
0.0
18.0


45
0.0
11.0
4.0
4.0
7.0
0.0
18.0


46
0.0
11.0
4.0
4.0
7.0
0.0
18.0


47
0.0
11.0
4.0
4.0
7.0
0.0
18.0


48
0.0
11.0
4.0
4.0
7.0
0.0
18.0


49
0.0
11.0
4.0
4.0
8.0
0.0
19.0


TXT_KEY_CITY_NAME_SPARTA
46
0.0
1.0
2.0
0.0
2.0
2.0
3.0


47
0.0
1.0
2.0
0.0
2.0
2.0
3.0


48
0.0
1.0
2.0
0.0
2.0
2.0
3.0


49
0.0
1.0
2.0
0.0
2.0
2.0
3.0

data4.groupby(level=0).cumsum()





スパイ
出力
文化
生産
研究
維持費
金銭


都市名
ターン数











TXT_KEY_CITY_NAME_ATHENS
41
4.0
20.0
4.0
8.0
12.0
0.0
0.0


42
8.0
41.0
8.0
19.0
22.0
0.0
0.0


43
12.0
59.0
12.0
26.0
33.0
0.0
0.0


44
16.0
77.0
16.0
33.0
44.0
0.0
0.0


45
20.0
95.0
20.0
40.0
55.0
0.0
0.0


46
24.0
113.0
24.0
47.0
66.0
0.0
0.0


47
28.0
131.0
28.0
54.0
77.0
0.0
0.0


48
32.0
149.0
32.0
61.0
88.0
0.0
0.0


49
36.0
168.0
36.0
69.0
99.0
0.0
0.0


TXT_KEY_CITY_NAME_SPARTA
46
0.0
3.0
2.0
2.0
1.0
2.0
0.0


47
0.0
6.0
4.0
4.0
2.0
4.0
0.0


48
0.0
9.0
6.0
6.0
3.0
6.0
0.0


49
0.0
12.0
8.0
8.0
4.0
8.0
0.0