代码之家  ›  专栏  ›  技术社区  ›  Michael

熊猫:根据列表设置值

  •  2
  • Michael  · 技术社区  · 6 年前

    我的数据帧如下:

    a      b
    0      123
    0      321
    0      456
    12345  1234
    43241  132
    0      2134
    12345  6543
    43241  987
    ....
    

    我需要根据列表在第三列中设置值(编辑: a 无需订购):

    a     0     12345 43241 ....
    c     0     1     2     ....
    

    所以它应该变成

    a      b     c
    0      123   0
    0      321   0
    0      456   0
    12345  1234  1
    43241  132   2
    0      2134  0
    12345  6543  1
    43241  987   2
    ....
    

    目前我正在一个周期内完成这项工作:

    a=data['a'].unique().tolist()
    c=list(range(len(a)))
    d=dict(zip(c,a))
    df['c']=0
    for i in d:
        df.loc[df['a']==d[i],'c']=i
    

    有更简单的方法吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   jpp    6 年前

    你可以用 pandas.factorize 以下内容:

    df['c'] = pd.factorize(df['a'])[0]
    
    print(df)
    
           a     b  c
    0      0   123  0
    1      0   321  0
    2      0   456  0
    3  12345  1234  1
    4  43241   132  2
    5      0  2134  0
    6  12345  6543  1
    7  43241   987  2
    
        2
  •  1
  •   jezrael    6 年前

    我想需要设置列 ordered categorical 然后转换为 cat.codes 以下内容:

    a = [12345, 0, 43241]
    
    df['c'] = df.a.astype('category', ordered=True, categories=a).cat.codes
    print (df)
           a     b  c
    0      0   123  1
    1      0   321  1
    2      0   456  1
    3  12345  1234  0
    4  43241   132  2
    5      0  2134  1
    6  12345  6543  0
    7  43241   987  2