python – 使用group by并使用前一行值应用lambda函数

我有以下数据框,每个日期,每小时,我想创建一个新列“结果”,这样如果列“B”中的值是> = 0,那么使用A列中的值;否则使用列B中0和前一行值之间的最大值

Date    Hour    A     B    result
1/1/2018    1    5     95    5
1/1/2018    1    16    79    16
1/1/2018    1    85   -6     79
1/1/2018    1    12   -18    0
1/1/2018    2    17    43    17
1/1/2018    2    17    26    17
1/1/2018    2    16    10    16
1/1/2018    2    142  -132   10
1/1/2018    2    10   -142   0

我尝试按日期和小时进行分组,然后使用shift应用lambda函数但是我收到了一个错误

df['result'] = df.groupby(['Date','Hour']).apply(lambda x: x['A'] if x['B'] >= 0 else np.maximum(0, x['B'].shift(1)), axis = 1)

解决方法:

使用np.where.只有在移动“B”时才需要groupby,因此您可以在不使用apply的情况下进行矢量化操作.

df['result'] = np.where(
    df.B >= 0, 
    df.A, 
    df.groupby(['Date', 'Hour'])['B'].shift().clip(lower=0))
df

       Date  Hour    A    B  result
0  1/1/2018     1    5   95     5.0
1  1/1/2018     1   16   79    16.0
2  1/1/2018     1   85   -6    79.0
3  1/1/2018     1   12  -18     0.0
4  1/1/2018     2   17   43    17.0
5  1/1/2018     2   17   26    17.0
6  1/1/2018     2   16   10    16.0
7  1/1/2018     2  142 -132    10.0
8  1/1/2018     2   10 -142     0.0

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...