我希望能够按列计算不同值(使用
我将尝试做以下事情:
pd.value_counts
)并通过MultiIndex中的某个级别对数据进行分组。使用groupby(level=
参数处理MultiIndex,但是apply
会引发ValueError
。
原始数据框:
>>> df = pd.DataFrame(np.random.choice(list('ABC'), size=(10,5)),
columns=['c1','c2','c3','c4','c5'],
index=pd.MultiIndex.from_product([['foo', 'bar'],
['w','y','x','y','z']]))
c1 c2 c3 c4 c5
foo w C C B A A
y A A C B A
x A B C C C
y A B C C C
z A C B C B
bar w B C C A C
y A A C A A
x A B B B A
y A A C A B
z A B B C B
我想要的是:
c1 c2 c3 c4 c5
foo A 4 2 0 3 2
B 1 2 2 1 2
C 0 1 3 1 1
bar A 4 1 0 1 2
B 0 2 2 1 1
C 1 2 3 3 2
我将尝试做以下事情:
>>> df.groupby(level=0).apply(pd.value_counts)
ValueError: could not broadcast input array from shape (5,5) into shape (5)
我可以手动完成,但我认为一定有更明显的方法。
groups = [g.apply(pd.value_counts).fillna(0) for n, g in df.groupby(level=0)]
index = df.index.get_level_values(0).unique()
correct_result = pd.concat(groups, keys=index) # THIS WORKS AS EXPECTED
我的意思是,这并不需要写很长的代码,但我觉得好像在重复造轮子。这种操作难道不是可以用groupby函数来实现吗?
除了自己手动分割、应用和合并数据之外,还有更简单的方法吗?
stack
unstack
的魔法真的起作用了!我喜欢它。谢谢! - Susensio