如何合并多列并创建唯一的数值

时间:2019-08-06 06:22:58

标签: python python-3.x pandas

我想通过两列的组合来生成唯一记录,并且该值必须始终相同。 例如,我要串联ALTER TABLE `mst_lyrics` CHANGE `lyrics_title` `lyrics_title` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; Col1并创建Col2 我想为串联列生成如下所示的数字值。

enter image description here

我的代码是这样的:

C12

4 个答案:

答案 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似乎更安全,并且可以提供更多控制权(例如,您可以使用sepna_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)})