Как создать столбец с повторяющимися значениями панд (несовпадение индексов) - PullRequest
0 голосов
/ 11 июня 2018

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

Я пытался:

df['Fruit Type']=['Bananas','Oranges','Strawberries']

там написано:

ValueError: length of values does not match length of index

** Мой индекс имеет длину около 8000 строк, поэтому существует несоответствие между индексом и количеством новыхзначения столбца

Я хочу, чтобы столбец выглядел следующим образом:

Fruit Type: Bananas Oranges Strawberries Bananas Oranges Strawberries Bananas Oranges Strawberries

Через некоторое время я нашел решение:

df.insert(0, 'Fruit Type', ['Bananas', 'Oranges','Strawberries']*int(((len(df))/3)))

0 обозначает номер столбца, затем имя столбца, затем значения столбца.* Int ... берет индекс, деленный на 3, и повторяет значения для этой суммы.Спасибо @acai за множитель в конце

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вам нужно повторять список, пока целая дробь не позволит вам повториться.После этого разница между сериями, которые вы только что имели, и длиной кадра данных будут равны количеству элементов, которые нужно добавить в серию из списка, который вы хотите повторить.

Рассмотрим пример ниже, где в df есть 10 точек данных.

df = pd.DataFrame({
    'col':range(0,10)
})
list_ = ['Bananas','Oranges','Strawberries']
ser = list_ * int(len(df)/len(list_))
df['Fruit Type'] = ser + list_[:len(df)-len(ser)]

Вывод:

    col fruit_type
0   0   Bananas
1   1   Oranges
2   2   Strawberries
3   3   Bananas
4   4   Oranges
5   5   Strawberries
6   6   Bananas
7   7   Oranges
8   8   Strawberries
9   9   Bananas
0 голосов
/ 11 июня 2018

Метод 1:

Допустим, ваш фрейм данных имел длину 10 элементов (и вы хотите повторить список из 3 фруктов).

>>> df
  column_a
0        a
1        b
2        c
3        d
4        f
5        e
6        x
7        s
8        n
9        i

Используя itertools.cycle, вы можете превратить свой список в итератор и циклически перебирать его до конца кадра данных:

from itertools import cycle

fruits = cycle(['Bananas','Oranges','Strawberries'])
df['Fruit_Type'] = [next(fruits) for fruit in range(len(df)]

>>> df
  column_a    Fruit_Type
0        a       Bananas
1        b       Oranges
2        c  Strawberries
3        d       Bananas
4        f       Oranges
5        e  Strawberries
6        x       Bananas
7        s       Oranges
8        n  Strawberries
9        i       Bananas

Метод 2

Вот уродливый хак, который вы можете использовать в качестве альтернативы:

Вы можете использовать pandas.np.tile (который является оберткой для numpy.tile), чтобы повторить ваш список, сколько бы раз это ни понадобилось (используя //оператор), а затем просто добавьте список до n-го элемента, необходимого для заполнения кадра данных:

fruits = ['Bananas','Oranges','Strawberries']

df['Fruit Type']= pd.np.tile(fruits, len(df) // len(fruits)).tolist() + fruits[:len(df)%len(fruits)]

>>> df
  column_a    Fruit Type
0        a       Bananas
1        b       Oranges
2        c  Strawberries
3        d       Bananas
4        f       Oranges
5        e  Strawberries
6        x       Bananas
7        s       Oranges
8        n  Strawberries
9        i       Bananas
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...