我的数据框如下所示:
col1 col2 col3
Aba xxx yyy
bab bhh jjj
ccc kkk lll
Aba xxx yyy
ccc kkk jjj
我想用以下内容替换每列的唯一值:
在col1
中:Aba
被a0
取代,bab
被a1
取代,ccc
被a2
替换为col2
出现在列中。
与xxx
类似:b0
被bhh
取代,b1
被a0,a1,a2,a3
取代等。
简而言之,第一列开始使用b0,b1,b2,b3
第二个c0,c1,c2
替换唯一值,第三列替换为MiniAccumuloCluster
等等。
在循环中寻找解决方案,以便我可以一起处理所有列和所有唯一值,因为我有超过一百万行。
谢谢,
答案 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