计算以熊猫数据框列中的值为条件的比率

时间:2018-05-04 18:43:42

标签: python pandas dataframe

我有以下类型的数据框

   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    

我很想找到一种方法来使用lambda函数。 有人可以帮忙找到解决这个问题的方法吗? 提前谢谢。

修改 在我对“天”字段感兴趣的情况下,例如可以从1到18180变化很大。

2 个答案:

答案 0 :(得分:1)

您可以使用合并,这样做的好处是可以处理缺失值

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

答案 1 :(得分:1)

考虑在辅助数据框上左合并,,连续的每日点数,然后换算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