Pandas dataframe替换列中的唯一值

2024-05-29 06:50:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据框如下所示:

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

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

col2相似:xxxb0替换,bhhb1等替换

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

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

谢谢


Tags: a2a1b0a0b1col2col1xxx
2条回答

我会这样做:

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

更通用的方法:

^{pr2}$

这是一个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

相关问题 更多 >

    热门问题