2017-07-27 72 views
0

對於下面的數據組的頻率:計算DataFrameGroupBy對象列(熊貓)

Index ADR EF INF SS class type 
1   1  1 0  0  SRI  F 
2   1  0 1  1  SRI  h 
3   0  1 0  0  NRI  N 
4   0  0 1  1  NRI  u 
5   1  0 1  1  NRI  l 

我需要基於在列「級」的值的第一組數據(兩組:SRI,NRI),以及然後計算列ADR,EF,INF,SS的頻率。這是我的代碼:

print (df.groupby("class").ADR.value_counts()) 
    print (df.groupby("class").EF.value_counts()) 
    print (df.groupby("class").INF.value_counts()) 
    print (df.groupby("class").SS.value_counts()) 

但我更喜歡把它寫成函數。任何建議?

+0

那麼這裏的分類是什麼? –

+0

對不起,我修好了。 – Mary

+0

「把它寫成函數」是什麼意思?該函數應該打印的東西,返回數據,別的東西..?或者你問如何編寫函數? – aless80

回答

1

這更具挑戰性,因爲您希望在可變數量的列上執行此操作。

您可以先使用,然後df.aggdf.groupby

In [1085]: df.groupby('class').agg(lambda x: [np.bincount(x)]).applymap(lambda x: x[0]) 
Out[1085]: 
      ADR  EF  INF  SS 
class         
NRI [2, 1] [2, 1] [1, 2] [1, 2] 
SRI [0, 2] [1, 1] [1, 1] [1, 1] 

再次,對於選擇性匯聚,它接受一個函數列的列表會做:

def foo(df, type, columns): 
    return df.groupby(type)[columns].agg(lambda x: [np.bincount(x)]).applymap(lambda x: x[0]) 
+0

@COLDSPEED,謝謝。因此,沒有辦法將groupby(「class」)的值作爲函數的輸入變量傳遞給它? – Mary

+0

@瑪麗編輯。你可以,但不知道它是如何工作的其他專欄。編輯我的答案。 –

+0

@COLDSPEED,你能解釋一下「np.bincount(x)」是如何工作的嗎? – Mary

1

或者你可以試試這個...

List=[] 
List2=[] 
for names,df1 in df.groupby('class'): 
    print(df1) 
    List.append(df1.drop(['class','type'],axis=1).apply(pd.value_counts, axis=0)) 
    List2.append(names) 

pd.concat(List,keys=List2).fillna(0) 

Out[110]: 
     ADR EF INF SS 
NRI 0 2.0 2 1 1 
    1 1.0 1 2 2 
SRI 0 0.0 1 1 1 
    1 2.0 1 1 1 
1
In [135]: df.drop(['Index','type'],1) \ 
    ...: .groupby("class") \ 
    ...: .agg([lambda x: x.eq(0).sum(), 'sum']) \ 
    ...: .rename(columns={'<lambda>':0,'sum':1}) \ 
    ...: .rename_axis(None) \ 
    ...: .stack() 
Out[135]: 
     ADR EF INF SS 
NRI 0 2 2 1 1 
    1 1 1 2 2 
SRI 0 0 1 1 1 
    1 2 1 1 1 

或作爲多列DF:

In [125]: df.drop(['Index','type'],1) \ 
    ...: .groupby("class") \ 
    ...: .agg([lambda x: x.eq(0).sum(), 'sum']) \ 
    ...: .rename(columns={'<lambda>':0,'sum':1}) \ 
    ...: .rename_axis(None) 
Out[125]: 
    ADR EF INF SS 
     0 1 0 1 0 1 0 1 
NRI 2 1 2 1 1 2 1 2 
SRI 0 2 1 1 1 1 1 1