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