多层级索引转换为列: 在pandas中将value_counts作为列获取

6

在非常普遍的意义上,我要解决的问题是将多级索引中的一个组件转换为列。也就是说,我有一个包含多级索引的Series,我想将索引的最低层转换为dataframe中的列。这是我正在尝试解决的实际问题:

这里我们可以生成一些示例数据:

foo_choices = ["saul", "walter", "jessee"]
bar_choices = ["alpha", "beta", "foxtrot", "gamma", "hotel", "yankee"]

df = DataFrame([{"foo":random.choice(foo_choices), 
                 "bar":random.choice(bar_choices)} for _ in range(20)])
df.head()

这给我们带来了,

     bar     foo
0    beta    jessee
1    gamma   jessee
2    hotel   saul
3    yankee  walter
4    yankee  jessee
...

现在,我可以通过 bar 进行分组并获取 foo 字段的 value_counts 值,

dfgb = df.groupby('foo')
dfgb['bar'].value_counts()

并且它输出,
foo            
jessee  hotel      4
        gamma      2
        yankee     1
saul    foxtrot    3
        hotel      2
        gamma      1
        alpha      1
walter  hotel      2
        gamma      2
        foxtrot    1
        beta       1

但是我想要的是类似于这样的东西,
          hotel    beta    foxtrot    alpha    gamma    yankee
foo                        
jessee     1       1       5          4        1        1
saul       0       3       0          0        1        0
walter     1       0       0          1        1        0

我的解决方案是编写以下代码:

for v in df['bar'].unique():
    if v is np.nan: continue
    df[v] = np.nan
    df.ix[df['bar'] == v, v] = 1

dfgb = df.groupby('foo')
dfgb.count()[df['bar'].unique()]
1个回答

10

我认为你想要:

dfgb['bar'].value_counts().unstack().fillna(0.)

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