我有一个包含以下数据的多索引熊猫数据框:
F M
0 5 10 30
x y a1 0 1 0 1
a2 1 0 0 0
a3 0 1 0 1
a4 0 1 0 2
x1 y1 a1 0 1 1 4
a2 0 1 0 1
a3 1 1 0 1
a4 2 1 1 2
x2 y2 a1 0 0 0 0
a2 0 0 0 0
我想通过(A,B)对数据进行分组,并将列C与行的总和合并在一起。
必填输出:
sex F M
counts 0 5 10 30 0 5 10 30
A B C
x y [a1,a2,a3, a4] 1 3 3 1 0 3 0 4
x1 y1 [a1, a2, a3, a4] 3 4 4 0 3 0 1 8
......
我尝试过df.groupby(['A', 'B']).sum()
,但是它忽略了输出数据框中的列C。
要复制的代码
index = pd.MultiIndex(levels=[['x', 'x1', 'x2'], ['y', 'y1', 'y2'], ['a1', 'a2', 'a3', 'a4']],
labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1]])
columns = pd.MultiIndex(levels=[['F', 'M'], [0, 5, 10, 30]],
labels=[[0, 0, 1, 1], [0, 1, 2, 3]])
data = np.array([
[0, 1, 0, 1],
[1, 0, 0, 0],
[0, 1, 0, 1],
[0, 1, 0, 2],
[0, 1, 1, 4],
[0, 1, 0, 1],
[1, 1, 0, 1],
[2, 1, 1, 2],
[0, 0, 0, 0],
[0, 0, 0, 0]])
df = pd.DataFrame(data, index=index, columns=columns)
答案 0 :(得分:2)
使用groupby
和sum
来聚合数字数据,并使用apply(tuple)
来聚合索引级别。
g = df.reset_index(level=-1).groupby(level=[0, 1])
res = g.sum().set_index(g.level_2.apply(tuple), append=True)
print(res)
F M
0 5 10 30
level_2
x y (a1, a2, a3, a4) 1 3 0 4
x1 y1 (a1, a2, a3, a4) 3 4 2 8
x2 y2 (a1, a2) 0 0 0 0
请注意,索引只能包含可哈希值,而列表则不可哈希,因此元组是下一个优点。