簡體   English   中英

計算DataFrameGroupBy對象列(熊貓)的頻率

[英]Calculating frequency of DataFrameGroupBy object columns (pandas)

對於以下數據集:

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())

但我更喜歡將其編寫為函數。 有什么建議嗎?

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

您可以先使用df.groupbydf.agg使用df.agg

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])

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

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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM