More than 1 year has 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 | 
  
 
行の絞込み(行数)
  
    
      |  | ターン数 | 指導者 | 都市名 | 金銭 | 研究 | 文化 | スパイ | 生産 | 維持費 | 
  
  
    
      | 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の取得)
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行存在する。以下のようにすることでそれは確認できる。
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 | 
  
 
  
    
      |  | 出力 | 
    
      | 都市名 | 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 | 
  
 
列全体の合計値を計算。
グループごとの再集計
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 | 
  
 
 