Python 用唯一性列表中的后续值替换列值

Python 用唯一性列表中的后续值替换列值,python,pandas,Python,Pandas,我有一份约1000件独特物品的清单 np.random.seed(0) unique1 = sorted(list(np.random.choice(np.arange(2000), 1000, False))) 以及一列约12 mil行,其中仅包含此列表中的整数 df = pd.DataFrame({'a': np.sort(np.random.choice(unique1[1:], 12000000))}) 我需要做的是创建一个新列,其中unique列表中的前一个元素总是比原始列中的元素

我有一份约1000件独特物品的清单

np.random.seed(0)
unique1 = sorted(list(np.random.choice(np.arange(2000), 1000, False)))
以及一列约12 mil行,其中仅包含此列表中的整数

df = pd.DataFrame({'a': np.sort(np.random.choice(unique1[1:], 12000000))})
我需要做的是创建一个新列,其中unique列表中的前一个元素总是比原始列中的元素多

我曾尝试使用apply进行此操作,但其效率非常可笑,并且在我的系统上使用了一个公共循环(大约2分钟),但我想知道我是否可以更有效地达到目的,使用较小的数字进行说明:

np.random.seed(0)
unique1 = sorted(list((np.random.choice(np.arange(20), 10, False))))
df = pd.DataFrame({'a': np.sort(np.random.choice(unique1[1:], 15))})

unique2 = unique1[1:]
df['b'] = df.a.apply(lambda x: unique1[unique2.index(x)])

newCol = []
for item in list(df.a):
    newCol.append(unique1[unique2.index(item)])
df['c'] = newCol
print(df, unique1)
     a   b   c
0    2   1   1
1    2   1   1
2    4   2   2
3    6   4   4
4    8   6   6
5    8   6   6
6    8   6   6
7   10   8   8
8   13  10  10
9   13  10  10
10  17  13  13
11  18  17  17
12  18  17  17
13  19  18  18
14  19  18  18 [1, 2, 4, 6, 8, 10, 13, 17, 18, 19]

这里的问题是您正在使用,它对所有唯一值进行线性搜索

如果您有足够的空间构建dict,您可以将其转换为恒定时间查找:

unique2 = {value: index for index, value in enumerate(unique1[1:])}
df['b'] = df.a.apply(lambda x: unique1[unique2[x]])
如果不能,在这种情况下,首先应该将值保留在数组或切片中,而不是列表中…,只要保持它们排序,至少可以使用或以对数时间而不是线性时间进行搜索:

如果unique2是一个数组而不是一个列表,那么这个速度会更快,但是只需要一个常量因子;它仍然是一个列表的对数时间

df['b'] = df.a.apply(lambda x: unique1[np.searchsorted(unique2, x)])