首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pandas df中将值重命名为随机值

在pandas df中将值重命名为随机值
EN

Stack Overflow用户
提问于 2020-09-01 05:52:50
回答 2查看 239关注 0票数 1

我在pandas df中有一个专栏sites。数据格式:字符串列表。我需要将列的值更改为随机生成的单词。我的数据如下:

代码语言:javascript
复制
row                    sites
1                    ["Elle", "Harpers", "Cosmo"]
2                    ["Elle", "Vogue"]
3                    ["Cosmo"]

所需输出:

代码语言:javascript
复制
row                    sites
1                     ["KLD", "GHL", "JGF"]
2                     ["KLD", "VGO"]
3                     ["JGF"]

我应该能够在numpy.random.randint之后反转名称,或者将它们保存为我想使用的VGO = Vogue格式,但这种方法似乎只适用于整数。与使用replace硬编码相比,生成名称的最快方法是什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-01 06:33:04

您可以对所有3个大写字母combinations_with_replacement的列表使用np.random.choice

代码语言:javascript
复制
from itertools import combinations_with_replacement
upperletters = map(chr, range(65, 91))
print(np.random.choice(list(map(''.join, 
                                combinations_with_replacement(upperletters, 3))), 
                       size=8, replace=False))
#['JPZ' 'SSU' 'AQW' 'GKQ' 'AIZ' 'UYY' 'IJS' 'AOR']

现在,要更改数据,您可以使用等价的字典执行explodemap

代码语言:javascript
复制
s = df['sites'].explode()
codes = np.random.choice(list(map(''.join, 
                                  combinations_with_replacement(map(chr, range(65, 91)),
                                                                3))), 
                         size=s.nunique(), replace=False)
d = {word:code for word, code in zip(s.unique(), codes)}
print(d) #so in d you keep the correspondence
{'Elle': 'IVV', 'Harpers': 'DDW', 'Cosmo': 'DKM', 'Vogue': 'MRV'}

df['sites'] = s.map(d).groupby(level=0).agg(list)
print(df)
   row            sites
0    1  [IVV, DDW, DKM]
1    2       [IVV, MRV]
2    3            [DKM]
票数 2
EN

Stack Overflow用户

发布于 2020-09-01 06:33:30

这里有一种方法:

代码语言:javascript
复制
import pandas as pd
import random

# use sample data to create data frame
data = [(1, ["Elle", "Harpers", "Cosmo"]),
        (2, ["Elle", "Vogue"]),
        (3, ["Cosmo"])]
df = pd.DataFrame(data, columns=['row', 'sites'])

# get unique sites
unique_sites = df.explode('sites').loc[:, 'sites'].sort_values().unique()

# build map from actual site to masked site - could use full alphabet below
random.seed(123456)
site_to_scrambled = {
    site: ''.join(random.choices('ABCDEFGHI', k=4))
    for site in unique_sites }

def convert(sites, site_to_scrambled):
    return [site_to_scrambled[site] for site in sites]

# apply the conversion 
# (keep both sites and sites_scrambled to verify)
df['sites_scrambled'] = df['sites'].apply(
    lambda x: convert(x, site_to_scrambled))
print(df)

   row                   sites     sites_scrambled
0    1  [Elle, Harpers, Cosmo]  [AFAC, BCEB, HHAB]
1    2           [Elle, Vogue]        [AFAC, AIDF]
2    3                 [Cosmo]              [HHAB]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63678664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档