2016-05-17 76 views
2

我有這樣的數據幀df的:大熊貓獲取值的頻率上多列

df = pd.DataFrame({'c':[1,1,2,2,3,3],'L0':['a','a','b','c','d','e'],'L1':['a','b','c','e','f','e']}) 

現在我試圖讓每個值的列L0L1c每個值的頻率。預期結果將是:

c a b c d e f 
1 3 1 0 0 0 0 
2 0 1 2 0 1 0 
3 0 0 0 1 2 1 

我以爲我可以使用類似:

df.pivot_table(index='c', columns=np.unique(['L0','L1']), aggfunc=f) 

,但我不能想出如何形容f應該能夠在得到value_counts()功能多列。

回答

3

你可以它通過使用crosstab方法默認計算所示因子的頻率表:

>>> df_1 = pd.crosstab(df.c, df.L0) 
>>> df_2 = pd.crosstab(df.c, df.L1) 

>>> df_1.add(df_2, fill_value=0) 

    a b c d e f 
c     
1 3 1 0 0 0 0 
2 0 1 2 0 1 0 
3 0 0 0 1 2 1 
+1

Brillian牛逼!謝謝 :) – knagaev

1

沒有試圖描述F,但希望爲您解決問題的其他方式

In [356]: df.set_index('c').stack().reset_index().groupby(['c', 0]).count().unstack().fillna(0) 
Out[356]: 
    level_1       
0  a b c d e f 
c         
1  3.0 1.0 0.0 0.0 0.0 0.0 
2  0.0 1.0 2.0 0.0 1.0 0.0 
3  0.0 0.0 0.0 1.0 2.0 1.0 
1

編輯:這是稍微簡單:

In[48]: df.groupby('c').apply(lambda df1: 
      df1.drop('c', axis=1).unstack().value_counts().to_frame().transpose() 
     ).reset_index(level=1, drop=True).fillna(0) 

的解釋見下文。


你要找的功能是groupby,不pivot。然後,您可以分別在每個數據幀上使用value_counts,按c值分組。

這是接近你想要的功能:

In[39] : df.groupby('c').apply(lambda df1: 
      df1.drop('c', axis=1).apply(pd.Series.value_counts).transpose() 
     ) 
Out[39]: 
     a b c d e f 
c       
1 L0 2 NaN NaN NaN NaN NaN 
    L1 1 1 NaN NaN NaN NaN 
2 L0 NaN 1 1 NaN NaN NaN 
    L1 NaN NaN 1 NaN 1 NaN 
3 L0 NaN NaN NaN 1 1 NaN 
    L1 NaN NaN NaN NaN 1 1 

爲了值相加,最終的結果是令人驚訝的複雜:

In[46]: df.groupby('c').apply(lambda df1: 
      df1.drop('c', axis=1).apply(pd.Series.value_counts).transpose().sum().to_frame().transpose() 
     ).reset_index(level=1, drop=True).fillna(0) 
Out[46]: 
    a b c d e f 
c     
1 3 1 0 0 0 0 
2 0 1 2 0 1 0 
3 0 0 0 1 2 1