pandas 选择每个组的模式,并根据条件分配回原始 Dataframe

zujrkrfu  于 2023-02-02  发布在  其他
关注(0)|答案(3)|浏览(113)

我有这样一个 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值。

f87krz0w

f87krz0w1#

我们可以用np.where来匹配你想要的大小写,np.mean会给予0.5如果0 == 1,大于0.5如果大于1,小于0.5如果大于0。

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))
  • 输出
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
iswrvxsc

iswrvxsc2#

因为你想要的输出和原始 Dataframe 的长度一样,groupby.transform看起来更合适,然后你可以传入一个lambda,如果它是单例的话,使用一个三元运算符来指定模式,否则指定长度。

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)

mzsu5hc0

mzsu5hc03#

我想你在找这个。

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
'''

相关问题