2014-02-23 139 views
4

能有人請解釋什麼是行說明有關大熊貓value_counts功能

result = data.apply(pd.value_counts).fillna(0) 

確實會在這裏?

import pandas as pd 
from pandas import Series, DataFrame 

data = DataFrame({'Qu1': [1, 3, 4, 3, 4], 
        'Qu2': [2, 3, 1, 2, 3], 
        'Qu3': [1, 5, 2, 4, 4]}) 

result = data.apply(pd.value_counts).fillna(0) 

In [26]:data 
Out[26]: 
Qu1 Qu2 Qu3 
0 1 2 1 
1 3 3 5 
2 4 1 2 
3 3 2 4 
4 4 3 4 

In [27]:result 
Out[28]: 
Qu1 Qu2 Qu3 
1 1 1 1 
2 0 2 1 
3 2 2 0 
4 2 0 2 
5 0 0 1 

回答

2

從文檔中,它會生成一個非空值的直方圖。在result的列Qu1處,可以看出在原始列data.Qu1中存在一個1,零2,兩個3,兩個4和零5。

+0

謝謝。我對直方圖這個詞不熟悉,否則就很清楚。太糟糕了,示例值不起作用。 –

7

我認爲了解發生了什麼最簡單的方法是分解它。

其中每列,value_counts只計算系列中的每個值出現的次數(即在4出現兩次在QU1列):

In [11]: pd.value_counts(data.Qu1) 
Out[11]: 
4 2 
3 2 
1 1 
dtype: int64 

當你的應用的每個列被重新調整與其他的結果,因爲1和5之間的每一個值被視爲它與range(1, 6)一致:

In [12]: pd.value_counts(data.Qu1).reindex(range(1, 6)) 
Out[12]: 
1  1 
2 NaN 
3  2 
4  2 
5 NaN 
dtype: float64 

你要算值,你沒看到0,而不是爲NaN,因此fillna:

In [13]: pd.value_counts(data.Qu1).reindex(range(1, 6)).fillna(0) 
Out[13]: 
1 1 
2 0 
3 2 
4 2 
5 0 
dtype: float64 

當你的應用,它concats這樣做的每一列結果:

In [14]: pd.concat((pd.value_counts(data[col]).reindex(range(1, 6)).fillna(0) 
         for col in data.columns), 
        axis=1, keys=data.columns) 
Out[14]: 
    Qu1 Qu2 Qu3 
1 1 1 1 
2 0 2 1 
3 2 2 0 
4 2 0 2 
5 0 0 1