我有这样一个 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值。
3条答案
按热度按时间f87krz0w1#
我们可以用
np.where
来匹配你想要的大小写,np.mean
会给予0.5
如果0 == 1,大于0.5
如果大于1,小于0.5
如果大于0。iswrvxsc2#
因为你想要的输出和原始 Dataframe 的长度一样,
groupby.transform
看起来更合适,然后你可以传入一个lambda,如果它是单例的话,使用一个三元运算符来指定模式,否则指定长度。mzsu5hc03#
我想你在找这个。