Python 带有lambda函数的DataFrame.groupby.apply()
我有一个数据框,如下所示:Python 带有lambda函数的DataFrame.groupby.apply(),python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,如下所示: Datetime值 -------------------------------------------- 2000-01-01 15:00:00 10 2000-01-01 16:00:00 12 2000-01-01 17:00:00 14 2000-01-01 18:00:00 16 2000-01-02 15:00:00 13 2000-01-02 16:00:00 18 2000-01-02 17
Datetime值
--------------------------------------------
2000-01-01 15:00:00 10
2000-01-01 16:00:00 12
2000-01-01 17:00:00 14
2000-01-01 18:00:00 16
2000-01-02 15:00:00 13
2000-01-02 16:00:00 18
2000-01-02 17:00:00 16
2000-01-02 18:00:00 15
--------------------------------------------
我想得到一个列,在这个列中,我可以从每天的特定时间(比如16:00:00)获得值的差异,如下所示:
Datetime值NewColumn
--------------------------------------------
2000-01-01 15:00:00 10 -
2000-01-01 16:00:00 12 0
2000-01-01 17:00:00 14 2
2000-01-01 18:00:00 16 4
2000-01-02 15:00:00 13 -
2000-01-02 16:00:00 18 0
2000-01-02 17:00:00 16 -2
2000-01-02 18:00:00 15 -3
--------------------------------------------
我尝试了以下代码,但显示了错误:
df['NewColumn']=df.groupby('Datetime')['Value'].apply(lambda x:x-df.loc[(df['Datetime'].dt.time==dt.time(hour=16)),'Value']
ValueError:缓冲区数据类型不匹配,应为“Python对象”,但得到“long”
我应该如何编写代码呢?IIUC,这是您需要的
df['Datetime']=pd.to_datetime(df['Datetime'])
df['NewColumn'] = (df.groupby(pd.Grouper(freq='D', key='Datetime'))['Value']
.apply(lambda x: x - df.loc[x.loc[df['Datetime'].dt.hour == 16].index[0],'Value']))
df.loc[df['Datetime'].dt.hour < 16, 'NewColumn'] = '-'
print(df)
您在一行代码中做了很多工作。我建议你把它分成几个小部分来帮助缩小问题的范围。将中间结果分配给它们自己的变量,例如
gb=df.groupby('Datetime')
。使用命名函数而不是lambda,这样可以更容易地调试到它中。为什么一天为+2,第二天为-2?我想取16:00:00的值的差值,所以第二天为16-18=-2;第一天是14-12=2
Datetime Value NewColumn
0 2000-01-01 15:00:00 10 -
1 2000-01-01 16:00:00 12 0
2 2000-01-01 17:00:00 14 2
3 2000-01-01 18:00:00 16 4
4 2000-01-02 15:00:00 13 -
5 2000-01-02 16:00:00 18 0
6 2000-01-02 17:00:00 16 -2
7 2000-01-02 18:00:00 15 -3