import pandas as pd
df = pd.DataFrame({
      'item':['a','b','c','d','e','f','g','h','i','k'],
      'counter':[1,2,3,1,2,3,1,2,3,1]
      })

Учитывая эту структуру, каков наилучший способ автоматически генерировать df['counter'] в виде повторяющегося диапазона целых чисел, циклически проходя через 1, 2 и 3, пока не дойдет до последней строки?

0
93i7hdjb 28 Фев 2018 в 23:40

3 ответа

Лучший ответ

Ты можешь сделать:

df["counter_gen"] = df.index % 3 + 1

+1 избавится от нуля, так как мод начинается с нуля, а 3 определяется вами.

2
user9425727user9425727 28 Фев 2018 в 20:45

Используя np.put

a=df.index.values
a
Out[637]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
np.put(a,a,np.array([1,2,3]))
a
Out[639]: array([1, 2, 3, 1, 2, 3, 1, 2, 3, 1], dtype=int64)
df['New']=a
df
Out[641]: 
   counter item  New
1        1    a    1
2        2    b    2
3        3    c    3
1        1    d    1
2        2    e    2
3        3    f    3
1        1    g    1
2        2    h    2
3        3    i    3
1        1    k    1
2
YOBEN_S 28 Фев 2018 в 20:57

Если производительность имеет решающее значение, вы можете использовать что-то вроде

np.repeat([[1, 2, 3]], len(df)/3 + 1, 0).ravel()

Для кадра данных длиной 10 ^ 6 это примерно в 8 раз быстрее, чем для создания (гораздо более элегантного) df.index % 3.

0
fuglede 28 Фев 2018 в 21:01