Создайте столбец pandas с числами от 1 до 3 и повторите снова

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных:

    StoreNumber    Year  
    1000          2000  
    1000          2001  
    1000          2002  
    1001          2000  
    1001          2001  
    1001          2002  
 

Я хочу добавить столбец, чтобы мой окончательный фрейм данных выглядел так:

 StoreNumber       Year   New
    1000          2000    1
    1000          2001    2
    1000          2002    3
    1001          2000    1
    1001          2001    2
    1001          2002    3 
 

Я не хочу, чтобы новая строка зависела от StoreNumber, который выглядит очевидным в примере. Я хочу начать нумерацию с 1, а когда я дойду до 3, снова начните с 1.
Как мне это сделать?

Ответ №1:

Вы можете использовать itertools.cycle для создания итератора и использовать его для генерации целевой последовательности:

 from itertools import cycle

num_cycle = cycle([1, 2, 3])
df['New'] = [next(num_cycle) for num in range(len(df))]
 

 import pandas as pd 
import itertools 

df = pd.DataFrame(
    data = [
        (1000, 2000),
        (1000, 2001),
        (1000, 2002),
        (1001, 2000),
        (1001, 2001),
        (1001, 2002),
    ],
    columns=['StoreNumber', 'Year']
)

num_cycle = itertools.cycle([1, 2, 3])
df['New'] = [next(num_cycle) for num in range(len(df))]

print(df)
 

И результат будет

    StoreNumber   Year  New
0         1000   2000    1
1         1000   2001    2
2         1000   2002    3
3         1001   2000    1
4         1001   2001    2
5         1001   2002    3
 

Ответ №2:

Вы можете создать базовый список [1, 2, 3] и повторять его столько раз, сколько необходимо.

 baselist = [1, 2, 3]
size = df.size[0]
df['New'] = (baselist * (size // len(baselist)   1))[size]
 

Ответ №3:

Вы можете использовать numpy.tile :

 In [507]: import numpy as np

In [508]: list_int = [1,2,3]
In [510]: df['New'] = np.tile(list_int, len(df)//len(list_int)   1)[:len(df)]

In [511]: df
Out[511]: 
   StoreNumber  Year  New
0         1000  2000    1
1         1000  2001    2
2         1000  2002    3
3         1001  2000    1
4         1001  2001    2
5         1001  2002    3
 

Ответ №4:

Вы можете использовать np.r_ для генерации диапазона, затем делить по модулю 3 на и добавлять 1 , чтобы создать счетчик, который повторяется каждые три строки:

 df['New'] = np.r_[:len(df)] % 3   1
 

    StoreNumber  Year  New
0         1000  2000    1
1         1000  2001    2
2         1000  2002    3
3         1001  2000    1
4         1001  2001    2
5         1001  2002    3