gpt4 book ai didi

python - Pandas groupby 和 value_counts

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:50 25 4
gpt4 key购买 nike

我想计算每列的不同值(我猜是 pd.value_counts)按 MultiIndex 中的某个级别对数据进行分组。多索引由 groupby(level= 参数处理,但 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对于 MultiIndex Series,然后是 SeriesGroupBy.value_counts最后unstack对于 DataFrame:

np.random.seed(123)

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']]))
print (df)
c1 c2 c3 c4 c5
foo w C B C C A
y C C B C B
x C B A B C
y B A C A B
z C B A A A
bar w A B C A C
y A A B A B
x A A A C B
y B C C C B
z A A C B A

df1 = df.stack().groupby(level=[0,2]).value_counts().unstack(1, fill_value=0)
print (df1)
c1 c2 c3 c4 c5
bar A 4 3 1 2 1
B 1 1 1 1 3
C 0 1 3 2 1
foo A 0 1 2 2 2
B 1 3 1 1 2
C 4 1 2 2 1

关于python - Pandas groupby 和 value_counts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51799818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com