首页 > 解决方案 > Lambda 函数减去 x 和前一个元素

问题描述

我有一个包含一些时间戳的数据框,我需要为每个 ID 计算每个时间戳之间的差异。我的数据框如下:

ID    Value   Date       Date_diff_cumsum   visVal  Weight   TempVal
 1    0.000 2017-02-13 20:54:00      0.0    0.000    75.0       NaN
 1   29.598 2017-02-13 21:02:00      8.0   29.598    75.0  4.933000
 1  273.000 2017-02-13 22:33:00      99.0  273.000   75.0  3.676768
 1  153.000 2017-02-13 23:24:00      150.0  153.000  75.0  1.360000
 1  136.902 2017-02-14 00:01:00      187.0  136.902  75.0  0.976128

现在,我需要将 Date_diff_cumsum 计算为每个时间戳之间的差异,而不是与第一个时间戳之间的差异。我的代码如下:

df = df.sort_values(by=['Date'])
df['Date_diff_cumsum'] = df.groupby('ID').Date.diff().dt.seconds / 60.0
df['Date_diff_cumsum'] = df.groupby('ID').Date_diff_cumsum.cumsum().fillna(0)
df['Value'] = df['Value'].apply(lambda x: x*1000)
df['visVal'] = df.groupby('ID')['Value'].transform(lambda x:(x-x.iloc[0]*100))
df['Weight'] = df['ID'].map(dfWeight.set_index('ID')['Value']).fillna(0)
df['TempVal'] = (df['Value']/(df['Weight'] * df['Date_diff_cumsum'])*100).fillna(0)

如何修改 lambda 函数以计算时间戳与前一个时间戳之间的 Date_diff_cumsum?

此外,在函数结束时,我对其他数据帧重复相同的操作,并且需要对每个数据帧和每个时间戳的所有 TempVal 求和,这是代码:

frame = [df, df1, df2]


final = pd.concat(frame)
final['FinalVal'] = final.groupby('ID')['TempVal'].cumsum()

最后一部分对于每个 df 在同一时间戳的每个 TempVal 的总和是否正确?非常感谢

编辑:预期输出:

ID    Value   Date       Date_diff_cumsum   visVal  Weight   TempVal
1    0.000 2017-02-13 20:54:00      0.0    0.000    75.0       0.0
1   29.598 2017-02-13 21:02:00      8.0    29.598   75.0       4.31
1  273.000 2017-02-13 22:33:00      91.0   273.000  75.0       4
1  153.000 2017-02-13 23:24:00      59.0   153.000  75.0       3.45
1  136.902 2017-02-14 00:01:00      37.0   136.902  75.0       4.9

在我的finalDf中,因为我什么都没有,因为我被卡住了:从df,df1,df2,每个时间戳的所有TempVal的总和,类似于这个

ID  TempVal1   Date              TempVal2  TempVal3       FinalVal
1   0.000  2017-02-13 20:54:00   0.0       0.000          0.0
1   4.31   2017-02-13 21:02:00   8.0      NaN             12.31
1   4      2017-02-13 22:33:00   91.0     273.000         368
1  3.45    2017-02-13 23:24:00   NaN      153.000         156.45
1  4.9     2017-02-14 00:01:00   37.0     NaN             41.9

如果我没有在一个数据帧中测量该时间戳,则在最终数据帧中它被认为是 NaN 或 0

标签: pythonpandasdataframe

解决方案


我只使用“差异”列我使用的数据只是值和日期

Value 	Date
0.000 	2017-02-1320:54:00
29.598 	2017-02-1321:02:00
273.000 2017-02-1322:33:00
153.000 2017-02-1323:24:00
136.902 2017-02-1400:01:00
然后下面的代码

from datetime import timedelta
df['diffT']=((pd.to_datetime(df['Date'],format='%Y-%m-%d%H:%M:%S')).diff())//timedelta(minutes=1)

结果如下。检查这是否有帮助

Value 	Date 	                diffT
0.000 	2017-02-1320:54:00 	NaN
29.598 	2017-02-1321:02:00 	8.0
273.000 2017-02-1322:33:00 	91.0
153.000 2017-02-1323:24:00 	51.0
136.902 2017-02-1400:01:00 	37.0


推荐阅读