Python Pandas中如何高效地根据上一行值创建并累加新列?

python pandas中如何高效地根据上一行值创建并累加新列?

本文探讨如何在Python Pandas中,根据上一行值高效创建并累加新列。 问题并非简单地使用apply函数就能解决,需要结合Pandas特性巧妙实现。

假设数据包含三列(‘col1’, ‘col2’, ‘col3’),目标是根据’col1’创建’col4’列:’col1’值在(3, 5)之间则’col4’为1,否则为0;且’col4’中值为1的连续数值进行累加。

直接使用循环遍历方法虽然清晰,但效率低:

values = [[5.5, 2.5, 10.0], [2.0, 4.5, 1.0], [2.5, 5.2, 8.0], [4.5, 5.8, 4.8], [4.6, 6.3, 9.6], [4.1, 6.4, 9.0],          [5.1, 2.3, 11.1], [4.8, 2.3, 4.8], [4.8, 2.3, 4.8]]df = pd.DataFrame(values, columns=['col1', 'col2', 'col3'], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'y'])col4 = []index = 1for one in df['col1']:    if 3 < one < 5:        index += 1        col4.append(index)    else:        index = 0        col4.append(index)df['col4'] = col4

自定义函数结合apply方法虽然有所改进,但不够简洁高效。

立即学习“Python免费学习笔记(深入)”;

更高效的方案是利用numpy.wherecumsum函数:

df['col4'] = pd.Series(np.where((df['col1'] > 3) & (df['col1'] < 5), 1, np.nan)).cumsum().fillna(0).astype(int)

此方法先根据条件创建包含1和NaN的Series,再用cumsum累加,最后用fillna将NaN替换为0。

更稳健的版本,能处理各种情况,包括中间出现不符合条件的情况:

v = df.apply(lambda x: 1 if 3 < x['col1'] < 5 else 0, axis=1)df['col4'] = (v.cumsum() - (v != v.shift()).cumsum() + (v != v.shift()) * v).fillna(0).astype(int)

此方法通过更复杂的逻辑处理中间不满足条件的情况,确保累加结果准确。 对比这些方法,选择合适的方法能显著提升代码效率和可读性。

以上就是Python Pandas中如何高效地根据上一行值创建并累加新列?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1358859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 22:13:04
下一篇 2025年12月11日 09:33:44

相关推荐

发表回复

登录后才能评论
关注微信