【问题标题】:How do I get to clean a column of mixed user id formats, turning rows into integers?如何清理混合用户 ID 格式的列,将行转换为整数?
【发布时间】:2021-05-20 09:30:19
【问题描述】:

我正在努力清理数据集,转换一列混合格式的用户 ID。检查后,使用 nunique() 命令,我可以观察到大约 15K 个不同的用户,所有用户都以类似 s123456 的数字或缩写形式如“abcde”列出。如何将不同的格式转换为可与其他数据集合并的可比较的数字格式?

我有这个:

df1['Get s-number IDs']
    0          s200100
    1          s203288
    2           wasnur
    3           hdmfla
    4           hdmfla
                ...
    1048555    s164118
    1048556    s164118
    1048557    s164118
    1048558    s164118
    1048559    s164118

我喜欢这个:

df1['User Name']
    0          200100
    1          203288
    2          wasnur (replaced by e.g. a unique dummy integer value)
    3          hdmfla (replaced by e.g. a unique dummy integer value)
    4          hdmfla (replaced by e.g. a unique dummy integer value)
               ...
    1048555    164118
    1048556    164118
    1048557    164118
    1048558    164118
    1048559    164118

当应用各种方法来提取数字或将字符串对象强制转换为 int dtype 时,我不断收到错误。

一旦修复,转换后的数据/dtypes 仍应反映数据集中由上述 nunique() 方法定义的相同数量的唯一值。

在一天结束的时候,我想得到一列我称之为用户名的行,然后将上面的数据与另一个数据集进行比较,以检查我正在使用有效的用户 ID(由我的内部定义客户)。

或者,我如何简单地从列行中删除类似文本的缩写?

感谢您的帮助,BR hubsandspokes

【问题讨论】:

    标签: python-3.x string type-conversion integer


    【解决方案1】:

    如果您希望分配给不以 s 开头的用户名的数值在运行之间保持一致,这就是我将如何解决您的问题: 给定一个数据框df:

        Get s-number IDs
    0   s200100
    1   s203288
    2   wasnur
    3   hdmfla
    4   hdmfla
    5   s164118
    6   s164118
    7   s164119
    8   s164108
    9   s164118  
    

    要转换为唯一的整数 ID,请执行以下操作:

    #    from secrets import choice    Removed, because random selection is no longer required
        class USERID:
            
            def __init__(self, idlen = 5):
                self._idln = idlen
                self._defids = dict()
                self._used = set()
                
            def getID(self, name):
                if name in self._defids.keys():
                    return self._defids[name]
                return (self.computId(name))
            
            def computId(self, name):
                def translate(name):
                     Removed random selection option
    #                nid = str(''.join(choice('0123456789') 
    #                                       for i in range (self._idln)))            
    #                while int(nid) in self._used or int(nid[0]) == 0:
    #                    nid = str(''.join(choice('0123456789') 
    #                                       for i in range (self._idln)))
                    
                    nid = str(hash(name))[:self._idlen)
                    self._used.add(int(nid))
                    self._defids[name] = int(nid)
                    return int(nid)
                    
                    return 0           
                if name[0] == 's':
                    try:
                        nid = int(name[1:])
                        self._used.add(nid)
                        self._defids[name] = nid
                        return nid
                    except:
                        return translate(name)
                else:        
                    return translate(name)  
    
    Then you can execute:
    
        ugen = USERID(6)
        df['User Name'] = df.apply(lambda row: ugen.getID(row['Get s-number IDs']), axis= 1)
        df  
    

    产量:

        Get s-number IDs    User Name
    0   s200100 200100
    1   s203288 203288
    2   wasnur  788680
    3   hdmfla  391167
    4   hdmfla  391167
    5   s164118 164118
    6   s164118 164118
    7   s164119 164119
    8   s164108 164108
    9   s164118 164118
    

    【讨论】:

    • 嗨,itprorh66 - 我合并了新代码,但它没有提供我正在寻找的结果......我非常感谢你的贡献......;o)我做错了什么用户名列仍然投射混合的用户 ID 格式?谢谢,轮毂和辐条
    • 好的,查看您的输入,我看到包含混合数据的列的名称被命名为“获取 s 编号 ID”,而您希望拥有唯一 ID 的列被命名为“用户名”。 “用户名”是否已存在于您的 df 中,还是应该添加?
    • 我刚刚更新了我的答案以更好地反映您的具体需求。
    • Thx,它现在似乎可以工作了,除了代表字符串值的虚拟值,例如wasur,每次运行代码时都会更改。您是否有机会更新代码以使值每次都相同或只是删除此类行值?目前,这些值似乎是随机变化的。再次,我非常感谢您的贡献,BR hubsandspokes..;o)
    • 保存计算值从一个 ru 到下一个的唯一方法是创建一个包含已定义值的文件,然后在尝试清理数据库之前加载此文件。我写的代码是假设你只想在加载所有数据后清理数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2020-08-11
    • 2014-10-17
    • 2022-07-29
    • 2020-12-28
    相关资源
    最近更新 更多