在pandas数据框中添加UUID

9

假设我有一个像这样的pandas DataFrame:

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("Name").cumcount()来识别具有相同名称和不同名称的行。然后,我将创建一个字典,其键为cumcount,值为uuid,并使用它将uuid添加到DF中。

虽然这样做可以起作用,但我想知道是否有更有效的方法?

2个回答

11

对数据框进行分组并应用uuid.uuid4比循环遍历组更有效。由于您希望保持数据框的原始形状,因此应使用pandas函数transform

使用您的示例数据框,我们将添加一列以创建一个需要应用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的次数与不同的组数相同。


7
这个怎么样?
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接