我有一个如下所示的数据框:
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)
但它似乎并不高效。还有更好的方法吗?
答案 0 :(得分:3)
让我们使用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))
输出:
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)]))