2017-07-27 79 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