Pandas中的层次多索引计数

27

假设我有一个Pandas的多索引数据框,例如:

                         A         B         C
X      Y     Z                                
bar   one    a   -0.007381 -0.365315 -0.024817
             b   -1.219794  0.370955 -0.795125
baz   three  a    0.145578  1.428502 -0.408384
             b   -0.249321 -0.292967 -1.849202
      two    a   -0.249321 -0.292967 -1.849202
      four   a    0.211234 -0.967123  1.202234
foo   one    b   -1.046479 -1.250595  0.781722
             a    1.314373  0.333150  0.133331
qux   one    c    0.716789  0.616471 -0.298493
      two    b    0.385795 -0.915417 -1.367644

如何统计一个层级中包含了多少个子层级?(例如,在层级 X 中包含了层级 Y

例如,在上面的情况下,答案将是:

X    Y 
bar  1
baz  3
foo  1
qux  2

更新

当我尝试使用 df.groupby(level=[0, 1]).count()[0] 时,我得到:

            C  D  E
A    B             
bar  one    1  1  1
     three  1  1  1
flux six    1  1  1
     three  1  1  1
foo  five   1  1  1
     one    1  1  1
     two    2  2  2

1
这个代码是否符合你的需求:df.groupby(level=0).count()[0] - EdChum
谢谢@EdChum,我认为它不会失败(我更新了DF以显示可能失败的情况)。 - Amelio Vazquez-Reina
在那种情况下,是行不通的。尝试使用df.groupby(level=[0,1]).count()[0]怎么样? - EdChum
3个回答

31

您可以执行以下操作(按级别 X 进行分组,然后计算每组中 Y 的唯一值的数量,在重置索引时更容易):

In [15]: df.reset_index().groupby('X')['Y'].nunique()
Out[15]: 
X
bar    1
baz    3
foo    1
qux    2
Name: Y, dtype: int64

9

我认为这也一定可以运作:

对于A级别:

df.groupby(level='A').size()

对于B级:

df.groupby(level=['A','B']).size()

2

在将数据转换为数据框之后,您可以随时向列名添加后缀并重置索引。

假设我有一个 pandas.series.Series 对象 "s"。

>> s = train.groupby('column_name').item_id.value_counts()
>> type(s)
pandas.core.series.Series
>> y = x.to_frame()
>> data = y.add_suffix('_Count').reset_index()
>> data.head() #It will be pandas dataframe with column updates with suffix "_Count"

我将多级索引的系列对象转换为单层索引的数据帧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接