【问题标题】:Pandas dataframe replace unique values in a column熊猫数据框替换列中的唯一值
【发布时间】:2018-08-16 20:53:02
【问题描述】:

我的数据框如下所示:

col1  col2  col3
Aba   xxx   yyy
bab   bhh   jjj
ccc   kkk   lll
Aba   xxx   yyy
ccc   kkk   jjj

我想用以下内容替换每列的唯一值: 在col1 中:Aba 被替换为a0bab 被替换为a1ccc 被替换为a2,无论它出现在列中的什么位置。

col2 类似:xxx 被替换为 b0bhh 被替换为 b1 等等。

简而言之,第一列开始用a0,a1,a2,a3 替换唯一值,第二列用b0,b1,b2,b3,第三列用c0,c1,c2.. 等等。

在循环中寻找解决方案,以便我可以处理所有列和所有唯一值,因为我有超过一百万行。

谢谢,

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我会这样做:

    In [184]: ['a','b','c'] + df.apply(lambda x: pd.factorize(x)[0]).astype(str)
    Out[184]:
      col1 col2 col3
    0   a0   b0   c0
    1   a1   b1   c1
    2   a2   b2   c2
    3   a0   b0   c0
    4   a2   b2   c1
    

    更通用的方法:

    import string
    
    c = list(string.ascii_lowercase)[:len(df.columns)]
    df1 = c + df.apply(lambda x: pd.factorize(x)[0]).astype(str)
    df1
      col1 col2 col3
    0   a0   b0   c0
    1   a1   b1   c1
    2   a2   b2   c2
    3   a0   b0   c0
    4   a2   b2   c1
    

    【讨论】:

    • @jezrael,谢谢!我没听明白 - 你说的“酒吧”是什么意思?
    • 我修改答案以删除它;)
    • @MaxU - 最好和最聪明的解决方案!非常感谢:)
    • @jezrael,啊,我现在明白了 - 您在谈论 iPython 提示符...感谢您编辑答案!:-)
    • 不,我认为 html 栏如果答案很长 ;)
    【解决方案2】:

    这是一个numpy 解决方案。它应该是高效的,因为列表理解通常比 apply + lambda 更快。

    字母范围来源:Alphabet range python

    import pandas as pd
    from string import ascii_lowercase
    
    df = pd.DataFrame({'col1': {0: 'Aba', 1: 'bab', 2: 'ccc', 3: 'Aba', 4: 'ccc'},
                       'col2': {0: 'xxx', 1: 'bhh', 2: 'kkk', 3: 'xxx', 4: 'kkk'},
                       'col3': {0: 'yyy', 1: 'jjj', 2: 'lll', 3: 'yyy', 4: 'jjj'}})
    
    a = df.values
    f = np.array([np.unique(a[:, i], return_inverse=True)[1] for i in range(a.shape[1])]).T
    
    res = list(ascii_lowercase[:a.shape[1]]) + \
          pd.DataFrame(f.astype(str), columns=df.columns)
    
    #   col1 col2 col3
    # 0   a0   b2   c2
    # 1   a1   b0   c0
    # 2   a2   b1   c1
    # 3   a0   b2   c2
    # 4   a2   b1   c0
    

    【讨论】:

    • 它给出了一个错误TypeError: unorderable types: int() < str()
    • 不,它没有。完整代码请查看更新。
    • 如果行中的任何值为 0,它会给出TypeError: unorderable types: int() < str()
    • 对于pandas,尽可能不要使用混合类型。如有必要,通过df[col] = df[col].astype(str) 将您的列转换为字符串。
    • 感谢您的回复。 @MaxU 以前的解决方案非常适合我的一行数据。
    猜你喜欢
    • 2016-10-27
    • 2022-06-24
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2017-11-01
    相关资源
    最近更新 更多