我有以下数据框,每个日期,每小时,我想创建一个新列“结果”,这样如果列“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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。