在pandas DataFrame中的新列中添加uuid

36
我希望为pandas DataFrame中的每一行添加一个uuid,并将其放在新的单独列中。当前的代码会使得这一列中每个值都相同。
import uuid
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3), columns=list('abc'),
                  index=['apple', 'banana', 'cherry', 'date'])
df['uuid'] = uuid.uuid4()
print(df)

               a         b         c                                  uuid
apple   0.687601 -1.332904 -0.166018  34115445-c4b8-4e64-bc96-e120abda1653
banana -2.252191 -0.844470  0.384140  34115445-c4b8-4e64-bc96-e120abda1653
cherry -0.470388  0.642342  0.692454  34115445-c4b8-4e64-bc96-e120abda1653
date   -0.943255  1.450051 -0.296499  34115445-c4b8-4e64-bc96-e120abda1653
我需要的是在“uuid”列的每一行中使用一个新的uuid。我还尝试过使用.apply()和.map(),但没有成功。
5个回答

46

这是一种方式:

df['uuid'] = [uuid.uuid4() for _ in range(len(df.index))]

你能解释一下为什么这不够用吗?df['uuid'] = [uuid.uuid4() for _ in df.index] 看起来有相同的结果.. 我错过了什么吗? - m1nkeh
3
@m1nkeh,这应该可行。但是使用循环遍历Python中的range比遍历NumPy数组更有效率。 - jpp
对于那些在此之后要使用 df.to_sql() 函数的人,请注意:Postgresql 数据库中您的 uuid 列的数据类型将是 text,而不是 uuid - Mehrdad Salimi

22

我无法在计算效率方面发表意见,但我更喜欢这里的语法,因为它与我通常用来生成新列的其他apply-lambda修改一致:

df['uuid'] = df.apply(lambda _: uuid.uuid4(), axis=1)
你也可以选择随机删除一列以去除轴要求(为什么axis=0是默认值,我永远无法理解):
你也可以选择随机删除一列来消除轴的限制(我永远无法理解为什么axis=0是默认值):
df['uuid'] = df['col'].apply(lambda _: uuid.uuid4())

这些的缺点在于技术上你传入了一个变量 (_),但实际上并没有使用它。有一点点可惜的是无法像 lambda: uuid.uuid4() 这样做,但 apply 不支持没有参数的 lamba 函数,这是合理的,因为其使用情况相当有限。


4
from uuid import uuid4
df['uuid'] = df.index.to_series().map(lambda x: uuid4())

5
好的,我会尽力满足您的需求。请提供需要翻译的具体内容。 - Sunil Garg

2

要创建新的列,必须有足够的值填充该列。如果我们知道行数(通过计算数据框的长度),我们可以创建一组值,然后将其应用于列。

import uuid
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3), columns=list('abc'),
                  index=['apple', 'banana', 'cherry', 'date'])


# you can create a simple list of values using a list comprehension 
#     based on the len (or number of rows) of the dataframe
df['uuid'] = [uuid.uuid4() for x in range(len(df))]
print(df)

apple  -0.775699 -1.104219  1.144653  f98a9c76-99b7-4ba7-9c0a-9121cdf8ad7f
banana -1.540495 -0.945760  0.649370  179819a0-3d0f-43f8-8645-da9229ef3fc3
cherry -0.340872  2.445467 -1.071793  b48a9830-3a10-4ce0-bca0-0cc136f09732
date   -1.286273  0.244233  0.626831  e7b7c65c-0adc-4ba6-88ab-2160e9858fc4

1

使用Pandas v1.5.2的S.A.Calder答案的修订版本:

from uuid import uuid4
df['uuid'] = df.index.map(lambda _: uuid4())

没有必要将索引转换为Series。用lambda _:替换lambda x:告诉程序员,在计算UUID时,由map方法提供的系列元素未被使用。


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