2016-08-04 2 views
2

Скажем, у меня есть панды DataFrame так:Добавить UUID, чтобы панды DF

df = pd.DataFrame({'Name': ['John Doe', 'Jane Smith', 'John Doe', 'Jane Smith','Jack Dawson','John Doe']}) 
df: 
     Name 
    0 John Doe 
    1 Jane Smith 
    2 John Doe 
    3 Jane Smith 
    4 Jack Dawson 
    5 John Doe 

И я хочу, чтобы добавить столбец с UUID, которые являются такими же, если имя совпадает. Например, указанное DataFrame должно стать:

df: 
      Name  UUID 
     0 John Doe 6d07cb5f-7faa-4893-9bad-d85d3c192f52 
     1 Jane Smith a709bd1a-5f98-4d29-81a8-09de6e675b56 
     2 John Doe 6d07cb5f-7faa-4893-9bad-d85d3c192f52 
     3 Jane Smith a709bd1a-5f98-4d29-81a8-09de6e675b56 
     4 Jack Dawson 6a495c95-dd68-4a7c-8109-43c2e32d5d42 
     5 John Doe 6d07cb5f-7faa-4893-9bad-d85d3c192f52 

В UUID должен быть сформирован из функции uuid.uuid4().

Моя нынешняя идея - использовать groupby («Имя»). Cumcount(), чтобы идентифицировать, какие строки имеют одно и то же имя, а какие разные. Затем я создаю словарь с ключом cumcount и значением uuid и использую это, чтобы добавить uuids в DF.

Хотя это сработает, мне интересно, есть ли более эффективный способ сделать это?

ответ

3

Как об этом

names = df['Name'].unique() 
for name in names: 
    df.loc[df['Name'] == name, 'UUID'] = uuid.uuid4() 

может сократить его

for name in df['Name'].unique(): 
    df.loc[df['Name'] == name, 'UUID'] = uuid.uuid4() 
+0

прекрасно работает. – unpairestgood

1

Группировка кадра данных и применение uuid.uuid4 будет более эффективной, чем цикл по группам. Поскольку вы хотите сохранить исходную форму своего фрейма данных, вы должны использовать функцию pandastransform.

Используя ваш образец данных, мы добавим столбец, чтобы применить ряд transform. Поскольку uuid.uuid4 не принимает никаких аргументов, это действительно не имеет значения, что такое столбец.

df = pd.DataFrame({'Name': ['John Doe', 'Jane Smith', 'John Doe', 'Jane Smith','Jack Dawson','John Doe']}) 
df.loc[:, "UUID"] = 1 

Теперь использовать transform:

import uuid 
df.loc[:, "UUID"] = df.groupby("Name").UUID.transform(lambda g: uuid.uuid4()) 

+----+--------------+--------------------------------------+ 
| | Name  |     UUID     | 
+----+--------------+--------------------------------------+ 
| 0 | John Doe  | c032c629-b565-4903-be5c-81bf05804717 | 
| 1 | Jane Smith | a5434e69-bd1c-4d29-8b14-3743c06e1941 | 
| 2 | John Doe  | c032c629-b565-4903-be5c-81bf05804717 | 
| 3 | Jane Smith | a5434e69-bd1c-4d29-8b14-3743c06e1941 | 
| 4 | Jack Dawson | 6b843d0f-ba3a-4880-8a84-d98c4af09cc3 | 
| 5 | John Doe  | c032c629-b565-4903-be5c-81bf05804717 | 
+----+--------------+--------------------------------------+ 

uuid.uuid4 будет называться столько раз, сколько есть отдельные группы

Смежные вопросы