为了账号安全,请及时绑定邮箱和手机立即绑定

python pandas 按值计数重新标记值

python pandas 按值计数重新标记值

守着一只汪 2023-09-12 17:34:33
给出以下示例:example = pd.DataFrame({'y':[1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,0,-1,-1,-1]})我想按频率计数按降序重新标记这些值。因此,我希望将案例数最多的值(例如 1)替换为 0,然后将下一个最大的 bin 替换为 1,依此类推所有值。需要注意的是我想忽略值为 -1 的情况。如果我运行value_counts(),我可以看到这个:y  1    10 2     4-1     3 0     2dtype: int64但我想要一个 pythonic 和非 hacky/clean 解决方案来创建以下内容:    y0   01   02   03   04   05   06   07   08   09   010  111  112  113  114  215  216 -117 -118 -1y  0    10 1     4-1     3 2     2dtype: int64(理想情况下,我也保留旧的专栏,以便保存良好的记录)。我可以循环每个值,检查它是否不是 -1,然后value_counts()用迭代次数替换它,但这感觉维护成本很高。有没有一种干净的方法来实现它?
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

由after withoutSeries.map的索引创建的字典使用:SeriesSeries.value_counts-1


s = example['y'].value_counts().drop(-1)

d = {v:k for k, v in dict(enumerate(s.index)).items()}

或者:


s = example['y'].value_counts().drop(-1)

d = dict(zip(s.index, range(len(s))))

m = example['y'].ne(-1)

example.loc[m, 'y'] = example.loc[m, 'y'].map(d)

print (example)

  y

0   0

1   0

2   0

3   0

4   0

5   0

6   0

7   0

8   0

9   0

10  1

11  1

12  1

13  1

14  2

15  2

16 -1

17 -1

18 -1

另一个想法是增加-1价值:-1dictionary


s = example['y'].value_counts().drop(-1)

d = {**{-1:-1}, **dict(zip(s.index, range(len(s))))}


example['y'] = example['y'].map(d)




查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信