简体   繁体   English

如何计算多级索引分组的百分比?

[英]how to calculate percentages of a multilevel index groupby?

Suppose you're given the following data:假设您获得以下数据:

records = [
    {'group': 'A', 'name': 'Chris', 'is_male': True, 'smoker': False}, 
    {'group': 'A', 'name': 'Bob', 'is_male': True, 'smoker': True}, 
    {'group': 'A', 'name': 'Dana', 'is_male': False, 'smoker': False}, 
    {'group': 'B', 'name': 'Alice', 'is_male': False, 'smoker': True}, 
    {'group': 'B', 'name': 'Michael', 'is_male': True, 'smoker': True}, 
    {'group': 'B', 'name': 'Ron', 'is_male': True, 'smoker': True}, 
    {'group': 'C', 'name': 'Rihanna', 'is_male': False, 'smoker': True}, 
    {'group': 'C', 'name': 'Madonna', 'is_male': False, 'smoker': True}, 
    {'group': 'C', 'name': 'Cher', 'is_male': False, 'smoker': False}, 
    {'group': 'C', 'name': 'John', 'is_male': True, 'smoker': True}, 
    
]

data = pd.DataFrame.from_dict(records)

If we do this:如果我们这样做:

data.groupby(['group', 'is_male', 'smoker']).count().reset_index()

we get:我们得到:

group   is_male smoker  name
A   False   False   1
A   True    False   1
A   True    True    1
B   False   True    1
B   True    True    2
C   False   False   1
C   False   True    2
C   True    True    1

What I'd like to do is to get the same data, but in percentages, by the size of the group我想做的是group的大小获取相同的数据,但以百分比表示

For example, in group B we'll get 1/3 and 2/3例如,在B组中,我们将得到1/32/3

How can I do that?我怎样才能做到这一点?

You can try crosstab :您可以尝试crosstab

s = pd.crosstab(data['group'], [data['is_male'], data['smoker']], normalize='index')

Output: Output:

is_male     False               True           
smoker      False     True      False     True 
group                                          
A        0.333333  0.000000  0.333333  0.333333
B        0.000000  0.333333  0.000000  0.666667
C        0.250000  0.500000  0.000000  0.250000

To match the long form, use stack :要匹配长格式,请使用stack

s.stack(level=(0,1)).reset_index(name='name')

Output: Output:

   group  is_male  smoker      name
0      A    False   False  0.333333
1      A    False    True  0.000000
2      A     True   False  0.333333
3      A     True    True  0.333333
4      B    False   False  0.000000
5      B    False    True  0.333333
6      B     True   False  0.000000
7      B     True    True  0.666667
8      C    False   False  0.250000
9      C    False    True  0.500000
10     C     True   False  0.000000
11     C     True    True  0.250000

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM