python - 如何改变熊猫的周期
问题描述
我有一个数据框,我需要按规则更改 3d 列
1) 如果 i+1 行和第 2 列的 i 行之间的差异 > 1 则第 3d 列 +1
我使用循环编写了一个代码,但这个代码是永恒的。
我用纯python写了一个代码,但是在pandas中必须有更好的方法来做到这一点。那么,如何在 pandas 中重写我的代码以减少时间?
old_store_id = -1
for i in range(0,df_sort.shape[0]):
if (old_store_id != df_sort.iloc[i, 0]):
old_store_id = df_sort.iloc[i, 0]
continue
if (df_sort.iloc[i,1]-df_sort.iloc[i-1,1])>1:
df_sort.iloc[i,2] = df_sort.iloc[i-1,2]+1
else:
df_sort.iloc[i,2] = df_sort.iloc[i-1,2]
代码前:
代码后:
解决方案
df['value'] = df.groupby('store_id')['period_id'].transform(lambda x: (x.diff()>1).cumsum()+1)
所以我们按 store_id 分组,检查 period 之间的差异何时大于 1,然后取 bool 的 cumsum。我们添加了 1 以使计数器从 1 而不是 0 开始。
使用上述代码前请确保 period_id 排序正确,否则无法正常工作。
推荐阅读
- android - 向下滚动时 RecyclerView 列表消失了
- java - PhantomJS webdriver 无法加载 url
- javascript - JavaScript,Canvas:在本地保存时更改文件名
- reactivesearch - 在 Reactivesearch v2 中覆盖或删除内联样式
- excel - 如何使用 VBA 获取谷歌搜索的第一个搜索结果链接?
- angular - 为什么 *ngIf 和 [hidden] 在重新评估父 > 子属性绑定时的工作方式不同
- javascript - 将其他函数中的函数作为参数传递
- php - 使用排列在 MySQL 中搜索
- graphql - 从 reactjs apollo 调用 graphAPI 的通用方法
- javascript - 在浏览器中渐进式加载大型 PDF 文档(线性化)