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

Python:如何将系列/列中的相同数字更改为其他值?

Python:如何将系列/列中的相同数字更改为其他值?

料青山看我应如是 2021-09-01 15:04:32
我正在尝试更改数据框中很长的列(大约 1mio 条目)的值。我有类似的东西####ID_Orig3452  3452  3452  6543  6543...我想要类似的东西####ID_new0  0  0  1  1  ...目前我正在这样做:j=0for i in range(0,1199531):     if data.ID_orig[i]==data.ID_orig[i+1]:        data.ID_orig[i] = j    else:        data.ID_orig[i] = j        j=j+1这需要很长时间......有没有更快的方法来做到这一点?我不知道值ID_orig有什么以及单个值出现的频率。
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

使用factorize,但如果有重复的组,则输出值设置为相同的数字。


将ed 值与ne( !=)进行比较的另一种解决方案更通用 - 始终创建新值,如果重复组值也是如此:shiftcumsum


df['ID_new1'] = pd.factorize(df['ID_Orig'])[0]

df['ID_new2'] = df['ID_Orig'].ne(df['ID_Orig'].shift()).cumsum() - 1

print (df)

   ID_Orig  ID_new1  ID_new2

0     3452        0        0

1     3452        0        0

2     3452        0        0

3     6543        1        1

4     6543        1        1

5      100        2        2

6      100        2        2

7     6543        1        3 <-repeating group

8     6543        1        3 <-repeating group


查看完整回答
反对 回复 2021-09-01
?
桃花长相依

TA贡献1860条经验 获得超8个赞

你可以这样做 …


import collections



l1 = [3452, 3452, 3452, 6543, 6543]

c = collections.Counter(l1)

l2 = list(c.items())

l3 = []


for i, t in enumerate(l2):

    for x in range(t[1]):

        l3.append(i)


for x in l3:

    print(x)

这是输出:


0

0

0

1

1


查看完整回答
反对 回复 2021-09-01
  • 3 回答
  • 0 关注
  • 369 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号