2017-07-27 70 views
0

對於以下數據集:使用函數來計算的列的頻率在一個數據幀(熊貓)

Index ADR EF INF SS 
1   1  1 0  0 
2   1  0 1  1 
3   0  1 0  0 
4   0  0 1  1 
5   1  0 1  1 

我要計算用於每個列的頻率。這是我的代碼:

df.ADR.value_counts() 
df.EF.value_counts() 
df.INF.value_counts() 
df.SS.value_counts() 

如何我可以寫一個函數,而不是重複的代碼爲每列做呢?我試過這個:

def frequency (df, *arg): 
    count =df.arg.value_counts() 
    return (count) 

但它不起作用。

回答

3

假設你想要計算所有列的頻率,而不是有選擇地,我不推薦自定義函數。

嘗試使用df.apply,傳遞pd.value_counts

In [1048]: df.apply(pd.value_counts, axis=0) 
Out[1048]: 
    ADR EF INF SS 
0 2 3 2 2 
1 3 2 3 3 

如果你想選擇計算,你可以通過列的列表的功能:

def foo(df, columns): 
    return df[columns].apply(pd.value_counts, axis=0) 

print(foo(df, ['ADR', 'EF'])) 
+0

是的,我希望有選擇地通過。非常感謝你。 – Mary

+0

@Mary如果你傳遞任何數量或順序的列,但將其作爲列表傳遞,這將起作用。很高興我能幫上忙。 –

+0

不錯'適用'! ~~ – Wen

2

這將做的工作:

def frequency(df,col_name): 
    count=df[col_name].value_counts() 
    return count 

在上面的函數中,您應該輸入列名稱as特林。例如:

frequency(df,'ADR') 

如果你想找到的所有列的計數,那麼最好是在@cᴏʟᴅsᴘᴇᴇᴅ的答案建議df.apply使用。

+0

OP想要計算所有列的值計數。您需要擴展您的解決方案。 –

+1

@cᴏʟᴅsᴘᴇᴇᴅ從問題的措辭來看,我認爲OP只對一列感興趣。無論如何,我更新了答案。 –

3

如果你只有值0和1

Freq=pd.concat([(df==0).sum(),(df==1).sum()],axis=1) 
Out[62]: 
     0 1 
Index 0 1 
ADR 2 3 
EF  3 2 
INF 2 3 
SS  2 3