#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