我想通过两列的组合来生成唯一记录,并且该值必须始终相同。
例如,我要串联ALTER TABLE `mst_lyrics` CHANGE `lyrics_title` `lyrics_title` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
,Col1
并创建Col2
我想为串联列生成如下所示的数字值。
我的代码是这样的:
C12
答案 0 :(得分:2)
使用factorize
并添加Transform
作为1
的起点:
1
答案 1 :(得分:0)
另一种不太优雅的解决方案:
# create a lookup C12 => number
lookup = {v:k for k, v in enumerate(df['C12'].drop_duplicates().values)}
# use it for the ID column (here called index)
df['index'] = df.C12.apply(lambda t: lookup[t])
结果:
Col1 Col2 Col3 C12 index
0 Bob Joe 0.272953 BobJoe 0
1 Joe Steve 0.496542 JoeSteve 1
2 Bill Bob 0.563204 BillBob 2
3 Mary Bob 0.007123 MaryBob 3
4 Joe Steve 0.182683 JoeSteve 1
答案 2 :(得分:0)
使用sklearn python库并以唯一的编号编码单词或字母,并且每次相同的单词具有相同的编号(在完整数据集中是唯一的)。
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
'Col3' : np.random.random(5)})
df['C12'] = df['Col1'] + df['Col2']
labelencoder = LabelEncoder()
df['C12'] = labelencoder.fit_transform(df['C12'])
print(df)
答案 3 :(得分:0)
另一个完整的解决方案。
如果您希望合并/串联的列的值包含很多重复,我建议您使此列categorical
到安全的空间,并加快处理速度(例如,如果您需要对该列进行过滤或在其上建立索引器。
您可以将其创建为分类列,如下所示:
df['C12'] = df['Col1'].str.cat(df['Col2'], na_rep='').astype('category')
对于索引列,您只需使用类别代码即可
df['index']= df['C12'].cat.codes
顺便说一句。当然,结合两个字符串的str.cat
方法与使用category
数据类型无关。我也可以按照您的方式串联内容,但是str.cat
似乎更安全,并且可以提供更多控制权(例如,您可以使用sep
和na_rep
之类的参数)。如果查看以下输出,您就会明白我的意思。
首先由上述方法创建(请注意na_rep=''
)
Col1 Col2 Col3 C12 index
0 Bob Joe 0.134319 BobJoe 4
1 Joe Steve 0.653212 JoeSteve 5
2 Bill Bob 0.736037 BillBob 3
3 Mary Bob 0.106365 MaryBob 6
4 Joe Steve 0.864427 JoeSteve 5
5 Anne None 0.731624 Anne 1
6 None Bill 0.736519 Bill 2
7 None None 0.531170 0
# the corresponding data types are:
Col1 object
Col2 object
Col3 float64
C12 category
index int8
其次,使用以下代码(请注意最后三行中的NaN
值):
df['C12'] = df['Col1'] + df['Col2']
df['index']= df['C12'].astype('category').cat.codes
# Output:
Col1 Col2 Col3 C12 index
0 Bob Joe 0.252860 BobJoe 1
1 Joe Steve 0.092115 JoeSteve 2
2 Bill Bob 0.105159 BillBob 0
3 Mary Bob 0.968287 MaryBob 3
4 Joe Steve 0.047131 JoeSteve 2
5 Anne NaN 0.241313 NaN -1
6 NaN Bill 0.605586 NaN -1
7 NaN NaN 0.341819 NaN -1
两个输出都使用以下数据进行处理(np.NaN
只是熊猫对缺失值的表示):
df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe', 'Anne', np.NaN, np.NaN],
'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve', np.NaN, 'Bill', np.NaN],
'Col3' : np.random.random(8)})