6

非常に一般的な意味で、私が解決しようとしている問題は、マルチレベル インデックスの 1 つのコンポーネントを列に変更することです。つまり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
...

これで、グループ化してフィールドの value_countsbarを取得できます。foo

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()]
4

1 に答える 1

10

私はあなたが欲しいと思います:

dfgb['bar'].value_counts().unstack().fillna(0.)
于 2012-08-15T15:40:50.050 に答える