2016-11-13 3 views
3

Учитывая следующий DataFrame:Создание нового столбца, состоящий из списков в DataFrame с помощью панд

t 
0 3 
1 5 

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

t newCol 
0 3 [1,2,3] 
1 5 [1,2,3,4,5] 

Другими словами, я хочу, чтобы применить list(range(1,t+1)) к каждой строке. Я знаю, как это сделать в цикле, но у меня есть длинный DataFrame, поэтому я ищу скорость. Спасибо.

+1

'DF [ 'NEWCOL'] = df.t.map (np.arange) + 1 ' – MaxU

ответ

2

Вот Векторизованный подход с использованием методов NumPy -

a = df.t.values 
idx = a.cumsum() 
id_arr = np.ones(idx[-1],dtype=int) 
id_arr[idx[:-1]] = -a[:-1]+1 
df['newCol'] = np.split(id_arr.cumsum(),idx[:-1]) 

Sample прогоны -

In [76]: df 
Out[76]: 
    t     newCol 
0 4   [1, 2, 3, 4] 
1 3    [1, 2, 3] 
2 7 [1, 2, 3, 4, 5, 6, 7] 
3 2     [1, 2] 
4 5  [1, 2, 3, 4, 5] 
5 3    [1, 2, 3] 
1

это так очень близко к @ ответу Divakar, но я считаю, чуть чуть более интуитивным.

значения получим для быстрого доступа Numpy
v = df.t.values
[3 5]
получить кумулятивные суммы v
cumsum = v.cumsum()
[3 8]
получить ди fferences
используется для отслеживания шпагата и принимать различия позже
diffs = cumsum - v
[0 3]
собрать большую накопленную сумму
Это является отправной точкой для конечных значений
prevals = np.ones(cumsum[-1], dtype=int).cumsum()
[1 2 3 4 5 6 7 8]
, наконец, разделить и поставить
df['new_col'] = np.split(prevals - np.repeat(diffs, v), diffs[1:])
enter image description here


все вместе

df = pd.DataFrame(dict(t=[4, 3, 7, 2, 5, 3])) 
v = df.t.values 
cumsum = v.cumsum() 
diffs = cumsum - v 
prevals = np.ones(cumsum[-1], dtype=int).cumsum() 
df['new_col'] = np.split(prevals - np.repeat(diffs, v), diffs[1:])