![](/img/trans.png)
[英]Python Pandas: Counting the Frequency of unique values over all Columns
[英]Counting unique values in columns - pandas Python
這是我的數據集:
Unique_ID No_of_Filings Req_1 Req_2 Req_3 Req_4
RCONF045 3 Blue Red White Violet
RCONF046 3 Blue Red White Brown
RCONF047 3 Blue Red White Brown
RCONF048 3 Black Yellow Green N/A
RCONF051 4 Black Yellow Green N/A
RCONF052 4 Black Brown Green Orange
我通過以下方式從最后4列(從Req_1到Req_4)中提取了唯一值:
pd.unique(df1[["Req_1","Req_2","Req_3","Req_4"]].values.ravel("K"))
Out[20]: array(['Blue', 'Black', 'Red', 'Yellow', 'Brown', 'White', 'Green',
'Violet', nan, 'Orange'], dtype=object)
這是我需要的輸出。 頻率=它在最后四列中顯示的次數(例如,黃色僅顯示兩次),並且申請數=總和( 如果要求在該行中,則為No_of_Filings)。 例如,藍色在前三行中,所以是3 + 3 + 3 = 9,而布朗在第二,第三和第六行中,所以它是3 + 3 + 4 = 10
Requirements Frequency Number of Filings
Blue 3 9
Black 3 11
Red 3 9
Brown 3 10
White 3 9
Green 3 11
Yellow 2 7
N/A 2 7
Violet 1 3
Orange 1 4
如何使用熊貓在上面新創建的數據框中創建這兩列?
謝謝
您可以使用agg
在這些方面做一些事情,但是需要事先進行一些重新設置。 這是一種獲取方法:
agg_df = (df.fillna('N/A').set_index(['Unique_ID', 'No_of_Filings'])
.stack()
.reset_index('No_of_Filings')
.groupby(0)
.agg(['sum', 'size'])
.reset_index())
agg_df.columns = ['Requirements', 'Number of Filings', 'Frequency']
>>> agg_df
Requirements Number of Filings Frequency
0 Black 11 3
1 Blue 9 3
2 Brown 10 3
3 Green 11 3
4 N/A 7 2
5 Orange 4 1
6 Red 9 3
7 Violet 3 1
8 White 9 3
9 Yellow 7 2
from collections import defaultdict
d = defaultdict(int)
for i, f, *r in df.values:
for v in r:
d[(v, 'filings')] += f
d[(v, 'frequency')] += 1
pd.Series(d).unstack().rename_axis('reqs').reset_index()
reqs filings frequency
0 NaN 7 2
1 Black 11 3
2 Blue 9 3
3 Brown 10 3
4 Green 11 3
5 Orange 4 1
6 Red 9 3
7 Violet 3 1
8 White 9 3
9 Yellow 7 2
請注意,您可以使用np.unique
立即獲取唯一性計數(已經完成了您的目標之一)。
df= df.fillna('NA')
cols = ["Req_1","Req_2","Req_3","Req_4"]
u = pd.unique(df[cols].values.ravel("K"))
s = np.unique(df[cols].values.ravel("K"), return_counts=True)
df2 = pd.DataFrame({'colors': u}).fillna('N/A')
df2['freq'] = df2.colors.map(dict(zip(*s)))
df2['n'] = [df[(df[cols] == v).sum(1) >=1].No_of_Filings.sum() for v in df2.colors]
colors freq n
0 Blue 3 9
1 Black 3 11
2 Red 3 9
3 Yellow 2 7
4 Brown 3 10
5 White 3 9
6 Green 3 11
7 Violet 1 3
8 N/A 2 0
9 Orange 1 4
聯合會
df.drop('Unique_ID',1).melt('No_of_Filings').\
fillna('NaN').groupby('value')['No_of_Filings'].agg(['count','sum'])
Out[56]:
count sum
value
Black 3 11
Blue 3 9
Brown 3 10
Green 3 11
NaN 2 7
Orange 1 4
Red 3 9
Violet 1 3
White 3 9
Yellow 2 7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.