Pandas数据帧替换列中的唯一值

时间:2018-03-08 13:24:56

标签: python pandas dataframe

我的数据框如下所示:

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

我想用以下内容替换每列的唯一值: 在col1中:Abaa0取代,baba1取代,ccca2替换为col2出现在列中。

xxx类似:b0bhh取代,b1a0,a1,a2,a3取代等。

简而言之,第一列开始使用b0,b1,b2,b3第二个c0,c1,c2替换唯一值,第三列替换为MiniAccumuloCluster等等。

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

谢谢,

2 个答案:

答案 0 :(得分:3)

我这样做:

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

答案 1 :(得分:0)

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