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

时间:2017-11-02 14:42:40

标签: python pandas

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

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)

但它似乎并不高效。还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

让我们使用applystr.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))

输出:

           id1            id2
0  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'])))

答案 1 :(得分:1)

这个怎么样:

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)]))