这是我的数据集:
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)中提取了 unique 值:
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
如何使用熊猫在上面新创建的数据框中创建这两列?
谢谢
答案 0 :(得分:2)
您可以使用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
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:2)
IIUC
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