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