In [1]:
import pandas as pd

In [2]:
df = pd.read_csv('data/src/estat_0003215840.csv')

In [3]:
df = df[['男女別・性比', '人口', '年齢各歳', 'value']]

In [4]:
print(df.head(10))


  男女別・性比   人口 年齢各歳     value
0    男女計  総人口   総数  126706.0
1    男女計  総人口   0歳     963.0
2    男女計  総人口   1歳    1000.0
3    男女計  総人口   2歳     960.0
4    男女計  総人口   3歳     975.0
5    男女計  総人口   4歳    1011.0
6    男女計  総人口   5歳    1017.0
7    男女計  総人口   6歳    1045.0
8    男女計  総人口   7歳    1049.0
9    男女計  総人口   8歳    1060.0

In [5]:
print(df['男女別・性比'].unique())


['男女計' '男' '女' '人口性比']

In [6]:
print(df['人口'].unique())


['総人口' '日本人人口']

In [7]:
print(df[['男女別・性比', '人口']].drop_duplicates())


    男女別・性比     人口
0      男女計    総人口
102    男女計  日本人人口
204      男    総人口
306      男  日本人人口
408      女    総人口
510      女  日本人人口
612   人口性比    総人口
714   人口性比  日本人人口

In [8]:
# df.pivot(index='年齢各歳', columns='男女別・性比', values='value')
# ValueError: Index contains duplicate entries, cannot reshape

In [9]:
df_jp = df.query('人口 == "日本人人口"')

In [10]:
print(df_jp.pivot(index='年齢各歳', columns='男女別・性比', values='value').head(10))


男女別・性比   人口性比      女      男     男女計
年齢各歳                               
0歳      105.0  462.0  485.0   947.0
100歳以上   15.0   59.0    9.0    67.0
10歳     105.0  518.0  544.0  1061.0
11歳     104.8  515.0  540.0  1054.0
12歳     104.9  516.0  541.0  1057.0
13歳     104.6  535.0  560.0  1095.0
14歳     105.2  543.0  571.0  1115.0
15歳     105.1  560.0  588.0  1148.0
16歳     105.3  567.0  597.0  1163.0
17歳     106.2  577.0  613.0  1189.0

In [11]:
print(df.set_index(['年齢各歳', '人口', '男女別・性比']).unstack(['人口', '男女別・性比']).sort_index(axis=1).head(10))


        value                                                   
人口      日本人人口                          総人口                      
男女別・性比   人口性比      女      男     男女計   人口性比      女      男     男女計
年齢各歳                                                            
0歳      105.0  462.0  485.0   947.0  105.0  470.0  493.0   963.0
100歳以上   15.0   59.0    9.0    67.0   15.0   59.0    9.0    67.0
10歳     105.0  518.0  544.0  1061.0  105.1  523.0  549.0  1072.0
11歳     104.8  515.0  540.0  1054.0  104.8  520.0  545.0  1065.0
12歳     104.9  516.0  541.0  1057.0  104.9  521.0  546.0  1067.0
13歳     104.6  535.0  560.0  1095.0  104.6  540.0  565.0  1105.0
14歳     105.2  543.0  571.0  1115.0  105.2  548.0  576.0  1124.0
15歳     105.1  560.0  588.0  1148.0  105.1  565.0  594.0  1158.0
16歳     105.3  567.0  597.0  1163.0  105.3  572.0  602.0  1174.0
17歳     106.2  577.0  613.0  1189.0  106.2  583.0  619.0  1202.0

In [12]:
df_pt = df.pivot_table(index='年齢各歳', columns=['人口', '男女別・性比'], values='value')

In [13]:
print(df_pt.head(10))


人口      日本人人口                          総人口                      
男女別・性比   人口性比      女      男     男女計   人口性比      女      男     男女計
年齢各歳                                                            
0歳      105.0  462.0  485.0   947.0  105.0  470.0  493.0   963.0
100歳以上   15.0   59.0    9.0    67.0   15.0   59.0    9.0    67.0
10歳     105.0  518.0  544.0  1061.0  105.1  523.0  549.0  1072.0
11歳     104.8  515.0  540.0  1054.0  104.8  520.0  545.0  1065.0
12歳     104.9  516.0  541.0  1057.0  104.9  521.0  546.0  1067.0
13歳     104.6  535.0  560.0  1095.0  104.6  540.0  565.0  1105.0
14歳     105.2  543.0  571.0  1115.0  105.2  548.0  576.0  1124.0
15歳     105.1  560.0  588.0  1148.0  105.1  565.0  594.0  1158.0
16歳     105.3  567.0  597.0  1163.0  105.3  572.0  602.0  1174.0
17歳     106.2  577.0  613.0  1189.0  106.2  583.0  619.0  1202.0

In [14]:
print(df_pt.columns)


MultiIndex(levels=[['日本人人口', '総人口'], ['人口性比', '女', '男', '男女計']],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 2, 3, 0, 1, 2, 3]],
           names=['人口', '男女別・性比'])

In [15]:
print(df_pt.loc[:, ('日本人人口', '男')].head(10))


年齢各歳
0歳        485.0
100歳以上      9.0
10歳       544.0
11歳       540.0
12歳       541.0
13歳       560.0
14歳       571.0
15歳       588.0
16歳       597.0
17歳       613.0
Name: (日本人人口, 男), dtype: float64

In [16]:
print(df_pt.loc[:, ('日本人人口', ['男', '女'])].head(10))


人口      日本人人口       
男女別・性比      女      男
年齢各歳                
0歳      462.0  485.0
100歳以上   59.0    9.0
10歳     518.0  544.0
11歳     515.0  540.0
12歳     516.0  541.0
13歳     535.0  560.0
14歳     543.0  571.0
15歳     560.0  588.0
16歳     567.0  597.0
17歳     577.0  613.0