3

我有一个数据框:

   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 开始。我该怎么做?

4

4 回答 4

3

您可以使用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
于 2021-02-06T10:16:59.353 回答
2

您可以制作基本列表[1, 2, 3]并根据需要重复多次。

baselist = [1, 2, 3]
size = df.size[0]
df['New'] = (baselist * (size // len(baselist) + 1))[size]
于 2021-02-06T10:28:04.867 回答
1

您可以使用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
于 2021-02-06T10:23:40.240 回答
1

您可以使用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
于 2021-02-06T10:35:50.360 回答