Заполните столбец, повторяя последовательность - PullRequest
1 голос
/ 08 апреля 2020

У меня есть датафрейм, который выглядит как ниже, я хочу вставить определенные значения в повторяющийся шаблон (наборы из 4). Так что мой фрейм данных выглядит как «df2» (показано под «df»). Я хотел бы, чтобы этот шаблон продолжался до конца строк (в данном случае это 10 строк вниз).

df:

ID    Descrip    Code
1     NaN
2     3
3     4
4     7
5     NaN
6     11
7     NaN
8     20
9     22
10    15

df2:

ID    Descrip    Code
1     NaN        MS
2     3          MU
3     4          MN
4     7          MO
5     NaN        MS
6     11         MU
7     NaN        MN
8     20         MO
9     22         MS
10    15         MU

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Мы могли бы использовать 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'...

Тогда мы можем назначить его новый столбец путем сопоставления индекса с созданным словарем

0 голосов
/ 08 апреля 2020

не самое элегантное решение, но вполне интуитивное

#create a dataframe with 10 rows
import pandas as pd
df = pd.DataFrame()
df['ID'] = [1,2,3,4,5,6,7,8,9,10]

#create a list containg the seqence of values we want to repeat
values = ['a','b','c','d']

#define the number of times this series can be repeated for a given dataframe length
n_repeats = len(df) % len(values)

#define new column as a list
repeated_values = []

#repeatedly extend the list
for iteration in range(1,n_repeats+2):
    repeated_values.extend(values)

#create a column which takes the repeated values and stops at the length of the dataframe
df['repeated_values'] = repeated_values[0:len(df)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...