熊猫-为所有行(尤其是重复的行)赋予唯一的标识符

时间:2019-02-06 05:05:03

标签: python pandas key

假设我有一个包含5列的DF,并且我想为每一行创建一个唯一的“键”。

   a  b  c  d  e
1  1  2  3  4  5
2  1  2  3  4  6
3  1  2  3  4  7 
4  1  2  2  5  6
5  2  3  4  5  6
6  2  3  4  5  6
7  3  4  5  6  7

我想创建一个“键”列,如下所示:

   a  b  c  d  e  key
1  1  2  3  4  5  12345
2  1  2  3  4  6  12346
3  1  2  3  4  7  12347
4  1  2  2  5  6  12256
5  2  3  4  5  6  23456
6  2  3  4  5  6  23456
7  3  4  5  6  7  34567

当然,现在的问题是第5和第6行是重复的。

我希望能够像这样创建唯一键:

   a  b  c  d  e  key
1  1  2  3  4  5  12345_1
2  1  2  3  4  6  12346_1
3  1  2  3  4  7  12347_1
4  1  2  2  5  6  12256_1
5  2  3  4  5  6  23456_1
6  2  3  4  5  6  23456_2
7  3  4  5  6  7  34567_1

不确定如何执行此操作,或者不确定这是否是最佳方法-感谢您的帮助。

谢谢

编辑:列将主要是字符串,而不是数字。

4 个答案:

答案 0 :(得分:4)

一种方式是将哈希散列到每一行的元组:

In [11]: df.apply(lambda x: hash(tuple(x)), axis=1)
Out[11]:
1   -2898633648302616629
2   -2898619338595901633
3   -2898621714079554433
4   -9151203046966584651
5    1657626630271466437
6    1657626630271466437
7    3771657657075408722
dtype: int64

In [12]: df['key'] = df.apply(lambda x: hash(tuple(x)), axis=1)

In [13]: df['key'].astype(str) + '_' + (df.groupby('key').cumcount() + 1).astype(str)
Out[13]:
1    -2898633648302616629_1
2    -2898619338595901633_1
3    -2898621714079554433_1
4    -9151203046966584651_1
5     1657626630271466437_1
6     1657626630271466437_2
7     3771657657075408722_1
dtype: object

注意:通常,您不需要这样做(不清楚为什么要这么做!)。

答案 1 :(得分:2)

尝试一下。

df['key']=df.apply(lambda x:'-'.join(x.values.tolist()),axis=1)
m=~df['key'].duplicated()
s= (df.groupby(m.cumsum()).cumcount()+1).astype(str)
df['key']=df['key']+'_'+s
print (df)

O / P:

   a  b  c  d  e          key
0  1  2  3  4  5  1-2-3-4-5_0
1  1  2  3  4  6  1-2-3-4-6_0
2  1  2  3  4  7  1-2-3-4-7_0
3  1  2  2  5  6  1-2-2-5-6_0
4  2  3  4  5  6  2-3-4-5-6_0
5  2  3  4  5  6  2-3-4-5-6_1
6  3  4  5  6  7  3-4-5-6-7_0
7  1  2  3  4  5  1-2-3-4-5_1

另一种更简单的方法:

df['key']=df['key']+'_'+(df.groupby('key').cumcount()).astype(str)

说明:

  1. 首先使用join创建您的唯一ID。
  2. 使用重复项创建序列s并进行累加,找到新值后重新启动。
  3. 最终连接密钥和您的序列。

答案 2 :(得分:0)

也许您可以做一些链接以下的事情

Connection string used:
dev-backend        | Cache details: Cache=Redis, CONNECTION_STRING=dev-redis:6379

Error:
dev-backend        | fail: ServiceStack.Redis.RedisNativeClient[0]
dev-backend        |       Could not connect to redis Instance at localhost:6379

答案 3 :(得分:0)

另一种方法是使用np.random.choice(range(10000,99999), len(df), replace=False)生成唯一的随机数,而不用替换df中的每一行:

df = pd.DataFrame(columns = ['a', 'b', 'c', 'd', 'e'],
                  data = [[1,  2,  3,  4,  5],[1,  2,  3,  4,  6],[1,  2,  3,  4,  7],[1,  2,  2,  5,  6],[2,  3,  4,  5,  6],[2,  3,  4,  5,  6],[3,  4,  5,  6,  7]])

df['key'] = np.random.choice(range(10000,99999), len(df), replace=False)

df

    a   b   c   d   e   key
0   1   2   3   4   5   10560
1   1   2   3   4   6   79547
2   1   2   3   4   7   24762
3   1   2   2   5   6   95221
4   2   3   4   5   6   79460
5   2   3   4   5   6   62820
6   3   4   5   6   7   82964