熊猫:随机化一列中的字母



我有一个数据框,如下所示:

id1           | id2
----------------------------
ab51c-ee-1a   | cga--=%abd21

我只想随机化字母:

id1           | id2
----------------------------
ge51r-eq-1b   | olp--=%cqw21

我想我可以做这样的事情:

newid1 = []
for index, row in df.iterrows():
    string = ''
    for i in row['id1']:
        if i.isalpha():
            string+=random.choice(string.letters)
        else:
            string+=i
    newcolumn.append(string)

但它似乎不是很有效。有没有更好的方法?

让我们使用

apply ,具有 str.replace 的力量,仅使用正则表达式替换字母,即

import string 
import random
letters = list(string.ascii_lowercase)
def rand(stri):
    return random.choice(letters)
df.apply(lambda x : x.str.replace('[a-z]',rand))

输出:

           编号1 编号20 gp51e-id-1v jvj--=%glw21

对于一个特定的列使用

df['id1'].str.replace('[a-z]',rand)

由@antonvbr添加:为了将来参考,如果我们想更改大写和小写,我们可以这样做:

letters = dict(u=list(string.ascii_uppercase),l=list(string.ascii_lowercase))
(df['id1'].str.replace('[a-z]',lambda x: random.choice(letters['l']))
          .str.replace('[A-Z]',lambda x: random.choice(letters['u'])))

这个怎么样:

import pandas as pd
from string import ascii_lowercase as al
import random
df = pd.DataFrame({'id1': ['ab51c-ee-1a'],
                   'id2': ['cga--=%abd21']})
al = list(al)
df = df.applymap(lambda x: ''.join([random.choice(al) if i in al else i for i in list(x)]))

最新更新