python - 如果前一列中的值不同,则计数器会增加,但在其他列值更改时会重置?
问题描述
我正在制作一个计数器列,仅当 (i-1) 的值与 (i) 的值不同时才会增加,但当 user_id 更改时它会重置。
输入:
user_id sc_id
1 100
1 100
1 101
1 102
2 100
2 101
3 101
3 103
下面是我的代码:
df['subcat_counter'] = 1
for i in range(1,len(df)):
if df.sc_id[i-1]==df.sc_id[i] and df['user_id'][i-1]==df['user_id'][i]:
df.at[i,'subcat_counter']=df.subcat_counter[i-1]
else:
df.at[i,'subcat_counter']=df.subcat_counter[i-1]+1
以下是所需的输出:
user_id sc_id subcat_counter
1 100 1
1 100 1
1 101 2
1 102 3
2 100 1
2 101 2
3 101 1
3 103 2
解决方案
我们可以groupby
在cumcount
此之前删除重复项,以便每个相同,user_id
并sc_id
获得相同的subcat_counter
. 之后fillna
我们forwardfill (ffill)
:
df['subcat_counter'] = df.drop_duplicates(['user_id', 'sc_id'])\
.groupby(['user_id'])['sc_id']\
.cumcount()+1
df.fillna(method='ffill', inplace=True)
print(df)
user_id sc_id subcat_counter
0 1 100 1.0
1 1 100 1.0
2 1 101 2.0
3 1 102 3.0
4 2 100 1.0
5 2 101 2.0
6 3 101 1.0
7 3 103 2.0
推荐阅读
- php - 源代码如何管理空白和连接
- vue.js - vue.js:范围自定义选项合并策略而不是全局
- mysql - 使用 MySQL Json_search 函数使用不区分大小写的搜索获取 JSON 数据中值的路径表达式
- javascript - Laravel - 无法从谷歌饼图监听器中获取价值
- unit-testing - vue单元测试 - 触发事件(表单提交)后数据未按预期更新
- ios - 为什么使用选择器需要@objc 标签?
- linux - 在不离开 bash 脚本的情况下中断 logcat?
- typo3 - FilesProcessor 与在自定义内容元素中归档的资产
- laravel - Laravel nova 工具 - 添加日期选择器
- c# - 从请求转换波斯数字