前回の更新でPrestoでデータの縦横変換をする方法を紹介しましたが、
クエリで処理を完結させる必要がないときは、一旦pandasのデータフレームに格納してから処理をするのも便利です。
その場合、 pandas.pivot_table を使います。
使い方は簡単で、pd.pivot_tableに、変換したいデータフレーム、
列にするカラム、行にするカラム、集計する値、集計に使う関数を指定するだけです。
fill_value引数で欠損値を埋めるなどの細かい設定もできます。
ドキュメントの例を使ってやってみます。
import pandas as pd
# データ作成
df = pd.DataFrame(
{
"A": ["foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar"],
"B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],
"C": ["small", "large", "large", "small",
"small", "large", "small", "small", "large"],
"D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
"E": [2, 4, 5, 5, 6, 6, 8, 9, 9]
}
)
print(df)
"""
A B C D E
0 foo one small 1 2
1 foo one large 2 4
2 foo one large 2 5
3 foo two small 3 5
4 foo two small 3 6
5 bar one large 4 6
6 bar one small 5 8
7 bar two small 6 9
8 bar two large 7 9
"""
table_0 = pd.pivot_table(
df,
values="D",
index="A",
columns="C",
aggfunc="sum",
fill_value=0,
)
print(table_0)
"""
C large small
A
bar 11 11
foo 4 7
"""
# 行や列、集計関数は配列で複数指定することもできる
table_1 = pd.pivot_table(
df,
values="D",
index=["A", "B"],
columns="C",
aggfunc=["sum", "count"],
fill_value=0,
)
print(table_1)
"""
sum count
C large small large small
A B
bar one 4 5 1 1
two 7 6 1 1
foo one 4 1 2 1
two 0 6 0 2
"""