Мы могли бы использовать itertools.cycle
с map
здесь:
from itertools import cycle
i = iter(['MS', 'MU', 'MN','MO'])
df['Code'] = df.index.map(dict(zip(df.index, cycle(i))))
print(df)
ID Descrip Code
0 1 NaN MS
1 2 3.0 MU
2 3 4.0 MN
3 4 7.0 MO
4 5 NaN MS
5 6 11.0 MU
6 7 NaN MN
7 8 20.0 MO
8 9 22.0 MS
9 10 15.0 MU
Другой подход, NumPy
на основе, будет np.resize
последовательность до df.shape[0]
. Обратите внимание, что, как упомянуто в документации, этот метод заполняет новый массив повторными копиями входного массива:
a = np.array(['MS', 'MU', 'MN','MO'])
df['Code'] = np.resize(a, df.shape[0])
Первый подход работает путем создания словаря, отображающего индекс в последовательность, где итератор циклически повторяется столько раз, сколько необходимо для размера index
фрейма данных. Это работает, поскольку zip
будет комбинировать элементы из обоих итераций, пока не исчерпан первый, который всегда будет бесконечным, что вполне очевидно:)
print(dict(zip(df.index, cycle(i))))
# {0: 'MS', 1: 'MU', 2: 'MN', 3: 'MO', 4: 'MS', 5: 'MU'...
Тогда мы можем назначить его новый столбец путем сопоставления индекса с созданным словарем