16
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-14

これは何?

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
16
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?