Панды - Предоставление всем строкам (особенно) дублирующихся строк уникальный идентификатор - PullRequest
0 голосов
/ 06 февраля 2019

Допустим, у меня есть DF с 5 столбцами, и я хочу сделать уникальный ключ для каждой строки.

   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 голосов
/ 06 февраля 2019

попробуйте.,

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. сначала создайте свой уникальный идентификатор с помощью объединения.
  2. создайте последовательность s, используя дубликат, и выполните cumsum, перезапустите, когда новое значение будет найдено.
  3. наконец, ключ concat и ваша последовательность s.
0 голосов
/ 06 февраля 2019

По пути хэширование кортежей каждой строки:

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

Примечание. Как правило, вам не нужно делать это (неясно, зачем вам это нужно!).

0 голосов
/ 06 февраля 2019

Другой подход заключается в использовании 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
0 голосов
/ 06 февраля 2019

Может быть, вы можете сделать что-нибудь по ссылке

import uuid
df['uuid'] = [uuid.uuid4() for __ in range(df.index.size)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...