将 uuid 添加到 pandas DataFrame 中的新列
Add uuid to a new column in a pandas DataFrame
我想为 pandas DataFrame 中单个新列中的每一行添加一个 uuid。这显然用相同的 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() 但没有成功。
这是一种方式:
df['uuid'] = [uuid.uuid4() for _ in range(len(df.index))]
要创建新列,您必须有足够的值来填充该列。如果我们知道行数(通过计算数据帧的长度),我们可以创建一组值,然后将其应用于列。
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
from uuid import uuid4
df['uuid'] = df.index.to_series().map(lambda x: uuid4())
我不能在这里谈论计算效率,但我更喜欢这里的语法,因为它与我通常用于生成新列的其他 apply-lambda 修改一致:
df['uuid'] = df.apply(lambda _: uuid.uuid4(), axis=1)
您也可以选择一个随机列来删除轴要求(为什么 axis=0
是默认值,我永远不会理解):
df['uuid'] = df['col'].apply(lambda _: uuid.uuid4())
这些的不利之处在于,从技术上讲,您传递的是一个实际上并不使用的变量 (_
)。能够执行类似 lambda: uuid.uuid4()
的功能会稍微好一点,但是 apply
不支持没有参数的 lambas,考虑到它的用例相当有限,这是合理的。
我想为 pandas DataFrame 中单个新列中的每一行添加一个 uuid。这显然用相同的 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() 但没有成功。
这是一种方式:
df['uuid'] = [uuid.uuid4() for _ in range(len(df.index))]
要创建新列,您必须有足够的值来填充该列。如果我们知道行数(通过计算数据帧的长度),我们可以创建一组值,然后将其应用于列。
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
from uuid import uuid4
df['uuid'] = df.index.to_series().map(lambda x: uuid4())
我不能在这里谈论计算效率,但我更喜欢这里的语法,因为它与我通常用于生成新列的其他 apply-lambda 修改一致:
df['uuid'] = df.apply(lambda _: uuid.uuid4(), axis=1)
您也可以选择一个随机列来删除轴要求(为什么 axis=0
是默认值,我永远不会理解):
df['uuid'] = df['col'].apply(lambda _: uuid.uuid4())
这些的不利之处在于,从技术上讲,您传递的是一个实际上并不使用的变量 (_
)。能够执行类似 lambda: uuid.uuid4()
的功能会稍微好一点,但是 apply
不支持没有参数的 lambas,考虑到它的用例相当有限,这是合理的。