{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from pandas import Series, DataFrame"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" letter | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" city | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" LA | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
"
\n",
" \n",
" SF | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"letter A B C D\n",
"city \n",
"LA 0 1 2 3\n",
"SF 4 5 6 7"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# サンプルを作ります。\n",
"dframe1 = DataFrame(np.arange(8).reshape((2, 4)),\n",
" index=pd.Index(['LA', 'SF'], name='city'),\n",
" columns=pd.Index(['A', 'B', 'C','D'], name='letter'))\n",
"dframe1"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.series.Series"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# stackを使うと、列名をindexにしてSeriesが作れます。\n",
"dframe_st = dframe1.stack()\n",
"type(dframe_st)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"city letter\n",
"LA A 0\n",
" B 1\n",
" C 2\n",
" D 3\n",
"SF A 4\n",
" B 5\n",
" C 6\n",
" D 7\n",
"dtype: int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dframe_st"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" letter | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" city | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" LA | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
"
\n",
" \n",
" SF | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"letter A B C D\n",
"city \n",
"LA 0 1 2 3\n",
"SF 4 5 6 7"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# unstackを使うと、元にもどります。\n",
"dframe_st.unstack()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" city | \n",
" LA | \n",
" SF | \n",
"
\n",
" \n",
" letter | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" A | \n",
" 0 | \n",
" 4 | \n",
"
\n",
" \n",
" B | \n",
" 1 | \n",
" 5 | \n",
"
\n",
" \n",
" C | \n",
" 2 | \n",
" 6 | \n",
"
\n",
" \n",
" D | \n",
" 3 | \n",
" 7 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"city LA SF\n",
"letter \n",
"A 0 4\n",
"B 1 5\n",
"C 2 6\n",
"D 3 7"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#レベルを選べます。\n",
"dframe_st.unstack(0)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" letter | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" city | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" LA | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
"
\n",
" \n",
" SF | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"letter A B C D\n",
"city \n",
"LA 0 1 2 3\n",
"SF 4 5 6 7"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 名前の指定も可能です。\n",
"dframe_st.unstack('letter')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" city | \n",
" LA | \n",
" SF | \n",
"
\n",
" \n",
" letter | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" A | \n",
" 0 | \n",
" 4 | \n",
"
\n",
" \n",
" B | \n",
" 1 | \n",
" 5 | \n",
"
\n",
" \n",
" C | \n",
" 2 | \n",
" 6 | \n",
"
\n",
" \n",
" D | \n",
" 3 | \n",
" 7 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"city LA SF\n",
"letter \n",
"A 0 4\n",
"B 1 5\n",
"C 2 6\n",
"D 3 7"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dframe_st.unstack('city')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Alpha Q 0\n",
" X 1\n",
" Y 2\n",
"Beta X 4\n",
" Y 5\n",
" Z 6\n",
"dtype: int64"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# NaNの扱い\n",
"ser1 = Series([0, 1, 2], index=['Q', 'X', 'Y'])\n",
"ser2 = Series([4, 5, 6], index=['X', 'Y', 'Z'])\n",
"\n",
"dframe = pd.concat([ser1, ser2], keys=['Alpha', 'Beta'])\n",
"dframe"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Q | \n",
" X | \n",
" Y | \n",
" Z | \n",
"
\n",
" \n",
" \n",
" \n",
" Alpha | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" NaN | \n",
"
\n",
" \n",
" Beta | \n",
" NaN | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Q X Y Z\n",
"Alpha 0 1 2 NaN\n",
"Beta NaN 4 5 6"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# unstackでDataFrameができます。\n",
"dframe.unstack()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Alpha Q 0\n",
" X 1\n",
" Y 2\n",
"Beta X 4\n",
" Y 5\n",
" Z 6\n",
"dtype: float64"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# stackは、デフォルトでNaNを取り除きます。\n",
"dframe.unstack().stack()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Alpha Q 0\n",
" X 1\n",
" Y 2\n",
" Z NaN\n",
"Beta Q NaN\n",
" X 4\n",
" Y 5\n",
" Z 6\n",
"dtype: float64"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# この動きを抑制することもできます。\n",
"dframe.unstack().stack(dropna=False)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}