[英]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.groupby
, df.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.