【发布时间】:2021-10-15 22:43:57
【问题描述】:
我有一个非常长的数据框,其中包含数字列和分类列。
id dur proto state att_cat
0 1 0.121460 tcp FIN Normal
1 2 0.649902 tcp FIN Normal
2 3 1.623047 tcp FIN Normal
3 4 1.681641 tcp FIN Normal
4 5 0.449463 tcp CON Normal
5 6 0.000009 udp INT Generic
6 7 0.505859 udp CON Normal
7 8 0.000009 udp INT Generic
8 9 0.000009 udp INT Generic
9 10 0.000009 tcp INT Generic
10 11 0.222761 unas ECO Normal
11 12 1.461278 tcp CON Normal
12 13 1.065289 arp FIN Normal
13 14 2.782646 udp CON Normal
14 15 1.457923 tcp FIN Normal
15 16 0.000009 udp INT Generic
17 18 0.125550 arp INT Generic
18 19 0.000009 tcp INT Generic
19 20 0.000009 tcp CON Generic
在 att_cat 列中,我有不同的标签要分组。当我这样做时,我观察到,例如,列 proto 有一些标签比其他标签出现的频率更高,例如,对于 att_cat=Normal,tcp 比 udp 和其他标签更频繁(不是显示在数据框中);对于 Generic,最常见的是 udp。
我希望,对于 att_cat 中的每个标签,将 n 个更频繁的标签保留在 proto(或任何分类列)中,其余的,用“att_cat_proto”替换它们。
例如,对于特性proto:
Normal = {tcp: 7, udp: 2, arp: 1, unas: 1}
Generic = {udp: 4, tcp: 3, arp: 1, unas: 0}
对于特征“状态”
Normal = {FIN: 5, CON: 4, INT: 1, ECO: 1}
Generic = {INT: 6, CON: 1, FIN: 1, ECO: 0}
如果我为 proto 功能的 Normal 和 Generic 修复 n=2,为 Normal 和 修复 n=2 n=1 表示 state 的 Generic,那么所需的结果应如下所示:
id dur proto state att_cat
0 1 0.121460 tcp FIN Normal
1 2 0.649902 tcp FIN Normal
2 3 1.623047 tcp FIN Normal
3 4 1.681641 tcp Normal_State Normal
4 5 0.449463 tcp CON Normal
5 6 0.000009 udp INT Generic
6 7 0.505859 udp CON Normal
7 8 0.000009 udp INT Generic
8 9 0.000009 udp INT Generic
9 10 0.000009 tcp Generic_State Generic
10 11 0.222761 Normal_Proto Normal_State Normal
11 12 1.461278 tcp CON Normal
12 13 1.065289 Normal_Proto FIN Normal
13 14 2.782646 udp CON Normal
14 15 1.457923 tcp FIN Normal
15 16 0.000009 udp INT Generic
17 18 0.125550 Generic_Proto INT Generic
18 19 0.000009 tcp INT Generic
19 20 0.000009 tcp Generic_State Generic
到目前为止,我已经尝试过类似的操作:
def rare_labels(df,target,cat_var,n):
df = df.copy()
# Selects the low frequency labels
cat_frame = df[cat_var]
most_freq = cat_frame.value_counts().index[:n].to_list()
less_freq = np.setdiff1d(cat_frame.unique(),most_freq)
# Substitute the low frequency labels by a common label
df[cat_var] = df.groupby(target).*******
# Returns the dataframe
return df
但我被困在分配部分。
【问题讨论】:
-
你能提供minimal reproducible example吗? (预期输出)
-
是的,谢谢@woblob 我编辑了这个问题!
标签: python pandas dataframe replace group-by