2017-02-01 9 views
2

Я новичок в pandas DataFrame, и у меня есть немного борьбы, поскольку я не могу понять, как получить доступ к определенной ячейке для расчета для заполнения новой ячейки.Создайте новый столбец из функции в pandas Dataframe, используя значения из DataFrame

Я хотел бы использовать применить для вызова внешней функции с данными из ячейки в строке - 1.

Я сделал это, но outputing все в простом массиве, но я уверен, что есть лучший способ сделать это:

Я строем своего dataFrame из CSV со следующим индексом:

DateIndex = pd.date_range(start="2005-1-1", end="2017-1-1", freq=BDay()) 

Я уверен, моя dataframe в порядке, в соответствии с приведенным ниже экстрактом:

2005-01-03 0.005742 
2005-01-04 0.003765 
2005-01-05 -0.005536 
2005-01-06 0.001500 
2005-01-07 0.007471 
2005-01-10 0.002108 
2005-01-11 -0.003195 
2005-01-12 -0.003076 
2005-01-13 0.005416 
2005-01-14 0.003090 

Итак, я хотел бы добавить 100 к первой записи, а для других добавить один, а затем умножить его на предыдущую запись.

я был в состоянии сделать это в массиве:

for i in range(0,len(df.index)): 
    if i == 0: 
     listV = [df.iloc[i] + 100] 
    else: 
     listV.append(listV[i-1] * (1 + df.iloc[i])) 

есть способ сделать это и поместить результат непосредственно в новом столбце кадра данных?

Спасибо большое, С уважением, Julien

+1

Вобще 'ФР [ 'новое имя столбца'] = listV'. Вам нужно удалить квадратные скобки в инструкции if, иначе оно превратит значение в список. Строка также должна быть внутри оператора append, как и в вашем заявлении else. –

ответ

2

инициализации

df = pd.DataFrame(dict(
     col=[ 0.005742, 0.003765, -0.005536, 0.0015 , 0.007471, 
       0.002108, -0.003195, -0.003076, 0.005416, 0.00309 ] 
    ), pd.to_datetime([ 
      '2005-01-03', '2005-01-04', '2005-01-05', '2005-01-06', '2005-01-07', 
      '2005-01-10', '2005-01-11', '2005-01-12', '2005-01-13', '2005-01-14']) 
    ) 

print(df) 

       col 
2005-01-03 0.005742 
2005-01-04 0.003765 
2005-01-05 -0.005536 
2005-01-06 0.001500 
2005-01-07 0.007471 
2005-01-10 0.002108 
2005-01-11 -0.003195 
2005-01-12 -0.003076 
2005-01-13 0.005416 
2005-01-14 0.003090 

комментарии
Это выглядит как серия возвратов. Добавляя 100 к первому наблюдению, вы маргинализация, что первое возвращение делает его .57базисных пунктов в отличие от .57процента

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

Это покажет совокупный рост 100что то, что я считаю, что вы после этого.

df.add(1).cumprod().mul(100) 

        col 
2005-01-03 100.574200 
2005-01-04 100.952862 
2005-01-05 100.393987 
2005-01-06 100.544578 
2005-01-07 101.295746 
2005-01-10 101.509278 
2005-01-11 101.184956 
2005-01-12 100.873711 
2005-01-13 101.420043 
2005-01-14 101.733431 

df.add(1).cumprod().mul(100).plot() 

enter image description here

+1

Вот где знание домена вступает в игру ;-) –

+0

Блестящий. Это точно! Я не могу вас поблагодарить. – JulienCoo

2

Вот лучший способ достичь того же:

col_copy = df.col.copy() # generate a copy to isolate the series completely 
col_copy.iloc[0] += 100 # Increment first row by 100 
col_copy.iloc[1:] += 1  # Increment 1 to rest 

df.assign(new_col=col_copy.cumprod()) # compute cumulative product and assign to new column 

урожайности:

enter image description here

данных:

DF Рассмотрим с помощью одного столбца 'Col', полученного:

txt = StringIO(
""" 
2005-01-03 0.005742 
2005-01-04 0.003765 
2005-01-05 -0.005536 
2005-01-06 0.001500 
2005-01-07 0.007471 
2005-01-10 0.002108 
2005-01-11 -0.003195 
2005-01-12 -0.003076 
2005-01-13 0.005416 
2005-01-14 0.003090 
""") 

df = pd.read_csv(txt, delim_whitespace=True, parse_dates=True, header=None, 
       index_col=['date'], names=['date', 'col']) 
df.index.name = None 
df 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^