Вычислите соотношение, зависящее от значения в столбце кадра данных panda - PullRequest
0 голосов
/ 04 мая 2018

У меня есть датафрейм следующего типа

   df = pd.DataFrame({'Days':[1,2,5,6,7,10,11,12],
                   'Value':[100.3,150.5,237.0,314.15,188.0,413.0,158.2,268.0]})

      Days Value  
   0  1    100.3  
   1  2    150.5  
   2  5    237.0   
   3  6    314.15  
   4  7    188.0   
   5  10   413.0   
   6  11   158.2   
   7  12   268.0   

и я хотел бы добавить столбец '+5Ratio', дата которого представляет собой соотношение между значением, соответствующим дням + 5 и дням.

Например, в первом ряду у меня будет 3.13210368893 = 314,15 / 100,3, во втором я буду иметь 1,24916943522 = 188,0 / 150,5 и т. Д.

      Days Value  +5Ratio
   0  1    100.3  3.13210368893   
   1  2    150.5  1.24916943522   
   2  5    237.0   ...  
   3  6    314.15    
   4  7    188.0    
   5  10   413.0    
   6  11   158.2    
   7  12   268.0    

Я изо всех сил пытаюсь найти способ сделать это, используя лямбда-функцию. Может ли кто-нибудь дать помощь, чтобы найти способ решить эту проблему? Заранее спасибо.

Редактировать В случае, если меня интересует, поле «Дни» может варьироваться от 1 до 18180, например.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Рассмотрим слияние слева на вспомогательном фрейме данных, days , для последовательных дневных точек, а затем смещение на 5 строк для расчета коэффициента. Окончательно удалите пустые строки дня:

days_df = pd.DataFrame({'Days':range(min(df.Days), max(df.Days)+1)})
days_df = days_df.merge(df, on='Days', how='left')

print(days_df)    
#     Days   Value
# 0      1  100.30
# 1      2  150.50
# 2      3     NaN
# 3      4     NaN
# 4      5  237.00
# 5      6  314.15
# 6      7  188.00
# 7      8     NaN
# 8      9     NaN
# 9     10  413.00
# 10    11  158.20
# 11    12  268.00

days_df['+5ratio'] = days_df.shift(-5)['Value'] / days_df['Value']    
final_df = days_df[days_df['Value'].notnull()].reset_index(drop=True)

print(final_df)
#    Days   Value   +5ratio
# 0     1  100.30  3.132104
# 1     2  150.50  1.249169
# 2     5  237.00  1.742616
# 3     6  314.15  0.503581
# 4     7  188.00  1.425532
# 5    10  413.00       NaN
# 6    11  158.20       NaN
# 7    12  268.00       NaN
0 голосов
/ 04 мая 2018

Вы можете использовать слияние, и выгода от этого может обработать пропущенное значение

s=df.merge(df.assign(Days=df.Days-5),on='Days')
s.assign(Value=s.Value_y/s.Value_x).drop(['Value_x','Value_y'],axis=1)
Out[359]: 
   Days     Value
0     1  3.132104
1     2  1.249169
2     5  1.742616
3     6  0.503581
4     7  1.425532
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...