我有以下列表:
x = np.array([1, 1, 2, 2, 2])
np.unique
值为 [1, 2]
如何生成以下列表:
[1, 2, 1, 2, 3]
即列表x
中的每个唯一元素从 1 开始的运行索引。
您可以在
按值本身分组后使用pandas.cumcount()
,它正是这样做的:
从 0 到该组的长度对每个组中的每个项目进行编号 - 1。
试试这个:
import numpy as np
import pandas as pd
x = np.array([1, 1, 2, 2, 2])
places = list(pd.Series(x).groupby(by=x).cumcount().values + 1)
print(places)
输出:
[1, 2, 1, 2, 3]
只需将np.unique
return_counts=True
与 listcomp 一起使用,np.hstack
即可。它仍然是更快的熊猫解决方案
c = np.unique(x, return_counts=True)[1]
np.hstack([np.arange(item)+1 for item in c])
Out[869]: array([1, 2, 1, 2, 3], dtype=int64)
我不确定这是更快还是更慢的解决方案,但是如果您只需要一个没有熊猫的列表结果,您可以尝试这个
arr = np.array([1, 1, 2, 2, 2])
from collections import Counter
ranges = [range(1,v+1) for k,v in Counter(arr).items()]
result = []
for l in ranges:
result.extend(list(l))
print(result)
[1, 2,1, 2, 3]
(或者用dict
而不是Counter()
制作自己的计数器(