繁体   English   中英

Select 各组模式并在条件下赋值回原来的dataframe

[英]Select mode of each group and assign back to the original dataframe on a condition

我有一个这样的 dataframe:

df = pd.DataFrame({
    'id_vector': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E'], 
    'svm_prediction': [0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0]
})

我想创建一个新列,其中每个值代表 svm_prediction 列中最常见的值,并且只针对特定的 id_vector 组。 例如,如果对于 id_vector 'A',svm_prediction 中最频繁的值是 1,则新列将具有所有值 1,0 相同,如果两个值的频率相等,则在每行中放置 2 或。

结果将是这样的,其中列new_label添加到df

result = pd.DataFrame({
    'id_vector': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E'], 
    'svm_prediction': [0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0], 
    'new_label': [0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2]
})

我试过:

r.groupby('id_vector')['svm_prediction'].mode()

但会引发错误,因为 groupby 没有属性模式

还:

r['average'] = r[['svm_prediction']].mode(axis=0)

为除第一行以外的每一行给出 NaN 值。

由于你想要的 output 与原来的 dataframe 长度相同, groupby.transform似乎更合适。 然后,您可以将 lambda 传递给它,如果它是 singleton 则使用三元运算符分配模式,否则分配长度。

mode_f = lambda x: m[0] if len(m:=x.mode()) == 1 else len(m)
df['new_label'] = df.groupby('id_vector')['svm_prediction'].transform(mode_f)

资源

我们可以使用np.where来匹配您想要的大小写,而np.mean将在零 == 一个时给出0.5 ,在一个大于 0 时给出大于0.5 ,在零更多时给出小于0.5

df['new_label'] = df.groupby('id_vector').svm_prediction.transform(np.mean)
df['new_label'] = np.where(df.new_label > 0.5 , 1, np.where(df.new_label < 0.5, 0, 2))

  • output
    id_vector   true_label  svm_prediction  new_label
0   A   0   0   0
1   A   0   0   0
2   A   0   1   0
3   A   0   1   0
4   A   0   0   0
5   B   0   0   2
6   B   0   1   2
7   B   0   0   2
8   B   0   1   2
9   C   0   1   1
10  C   0   0   1
11  C   0   1   1
12  C   0   1   1
13  D   1   1   0
14  D   1   0   0
15  D   1   0   0
16  D   1   0   0
17  E   1   0   2
18  E   1   1   2
19  E   1   1   2
20  E   1   0   2

好吧,我想你正在寻找这个。

result_final = df.groupby('id_vector')['svm_prediction'].agg(pd.Series.mode)
print(result_final)
'''
id_vector
A         0
B    [0, 1] #probably both repeated same time
C         1
D         0
E    [0, 1]
Name: svm_prediction, dtype: object
'''

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM