根据出现顺序在Python中编码列表

时间:2019-07-08 14:30:10

标签: python numpy

我有一个这样的列表

['A', 'A', 'B', 'B', 'A+B', 'A+B', 'B', 'B', 'A']

我想将此列表转换为这样

[1, 1, 2, 2, 3, 3, 4, 4, 5]

我要做的是,我将从值1开始,当列表中的值发生更改时,我会将手头的值加1。

这是我现在使用的代码,

counts = []
count = 1

for i in range(1, len(p)):
    print(p[i-1], p[i])
    if p[i-1] == p[i]:
        counts.append(count)
    else:
        counts.append(count)
        count += 1

if p[-2] == p[-1]:
    counts.append(counts[-1])
else:
    counts.append(counts[-1] + 1)

如何在Python中有效地做到这一点?如果需要,我也可以使用numpy

1 个答案:

答案 0 :(得分:5)

这是使用NumPy做到这一点的简单方法:

import numpy as np

data = np.array(['A', 'A', 'B', 'B', 'A+B', 'A+B', 'B', 'B', 'A'])
result = np.concatenate([[1], 1 + np.cumsum(data[:-1] != data[1:])])
print(result)
# [1 1 2 2 3 3 4 4 5]

或与熊猫一起使用

import pandas as pd

data = pd.Series(['A', 'A', 'B', 'B', 'A+B', 'A+B', 'B', 'B', 'A'])
result = data.ne(data.shift(1)).cumsum()
print(result)
# 0    1
# 1    1
# 2    2
# 3    2
# 4    3
# 5    3
# 6    4
# 7    4
# 8    5
# dtype: int32