熊猫:根据列表设置值

时间:2018-06-26 11:50:53

标签: python pandas

我的数据框是这样的:

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 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

我认为需要将列设置为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