2014-05-20 4 views
4

팬더를 사용하여 요약하려고하는 매월 데이터가 있으며 매월 발생하는 고유 항목 수를 계산해야합니다.팬더 카운트 월별 고유 발생 횟수

import pandas as pd 

mnths = ['JAN','FEB','MAR','APR'] 
custs = ['A','B','C',] 

testFrame = pd.DataFrame(index=custs, columns=mnths) 
testFrame['JAN']['A'] = 'purchased Prod' 
testFrame['JAN']['B'] = 'No Data' 
testFrame['JAN']['C'] = 'Purchased Competitor' 
testFrame['FEB']['A'] = 'purchased Prod' 
testFrame['FEB']['B'] = 'purchased Prod' 
testFrame['FEB']['C'] = 'purchased Prod' 
testFrame['MAR']['A'] = 'No Data' 
testFrame['MAR']['B'] = 'No Data' 
testFrame['MAR']['C'] = 'Purchased Competitor' 
testFrame['APR']['A'] = 'Purchased Competitor' 
testFrame['APR']['B'] = 'purchased Prod' 
testFrame['APR']['C'] = 'Purchased Competitor' 

uniqueValues = pd.Series(testFrame.values.ravel()).unique() 

#CODE TO GET COUNT OF ENTRIES IN testFrame BY UNIQUE VALUE 

원하는 출력 :

   JAN FEB MAR APR 
purchased Prod ?  ?  ?  ? 
Purchased Competitor ? ?  ?  ? 
No Data   ?  ?  ?  ? 

내가 고유 한 값을 얻을하고 올바른 축으로 새로운 dataframe를 만들 수 있습니다/열

여기에 몇 가지 예제 코드는 내가 할 노력하고있어 보여줍니다이다 Q 아직 없습니다 Pandas: Counting unique values in a dataframe Find unique values in a Pandas dataframe, irrespective of row or column location

하지만 :

여기 시작하고 여기에 uite는 필요한 형식으로 출력을 얻습니다. df.groupby 구문이나 df.apply 구문을 어떻게 적용 할 지 잘 모르겠습니다.

답변

5

필링은 선택 사항입니다.

In [40]: testFrame.apply(Series.value_counts).fillna(0) 
Out[40]: 
         JAN FEB MAR APR 
No Data     1 0 2 0 
Purchased Competitor 1 0 1 2 
purchased Prod   1 3 0 1 

다음은 유용한 트릭입니다. 나는 함수를 만들고 들어오는 것을 출력 할 것이다. 그러면 무슨 일이 일어나는지 쉽게 알 수 있습니다.

In [20]: def f(x): 
    ....:  print(x) 
    ....:  return x.value_counts() 
    ....: 

In [21]: testFrame.apply(f) 
A   purchased Prod 
B     No Data 
C Purchased Competitor 
Name: JAN, dtype: object 
A   purchased Prod 
B     No Data 
C Purchased Competitor 
Name: JAN, dtype: object 
A purchased Prod 
B purchased Prod 
C purchased Prod 
Name: FEB, dtype: object 
A     No Data 
B     No Data 
C Purchased Competitor 
Name: MAR, dtype: object 
A Purchased Competitor 
B   purchased Prod 
C Purchased Competitor 
Name: APR, dtype: object 
Out[21]: 
         JAN FEB MAR APR 
No Data     1 NaN 2 NaN 
Purchased Competitor 1 NaN 1 2 
purchased Prod   1 3 NaN 1 

[3 rows x 4 columns] 

그래서 그는

In [22]: testFrame.iloc[0].value_counts() 
Out[22]: 
purchased Prod   2 
Purchased Competitor 1 
No Data     1 
dtype: int64 
+0

완벽한 (올바른 레이블) 그들을 함께 concatting 다음이 작업을 수행! 이것은 내가 찾고 있었던 바로 그 것이다. 내 혼란은 Series.value_counts가 df.apply 메소드에서 요구하는 인수에 맞지 않는 것처럼 보입니다. value_counts를 적용 할 축을 어떻게 알 수 있습니까? – flyingmeatball

0
li = [testFrame.ix[:,i].value_counts() for i in range(len(mnths))] 
frame = pd.DataFrame(li, index=mnths) 

frame.fillna(value=0).swapaxes(0,1) 
Out[42]: 
         JAN FEB MAR APR 
No Data     1 0 2 0 
Purchased Competitor 1 0 1 2 
purchased Prod   1 3 0 1 

[3 rows x 4 columns]