Python 用唯一性列表中的后续值替换列值
我有一份约1000件独特物品的清单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列表中的前一个元素总是比原始列中的元素
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)])