python - 根据另一个系列的标志的新熊猫系列
问题描述
我有一个类似于这样的数据框:
>>> d = {'ID': ['ID1', 'ID2', 'ID3', 'ID4', 'ID5', 'ID6', 'ID7', 'ID8', 'ID9', 'ID10'],
'A': [1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
'B': [145,158,240,250,199,204,300,350,467,578]}
>>> df = pd.DataFrame(data=d)
我想创建一个新系列 ,F
来标记每 100 个单位的列B
(从 column 中的第一个值开始计数B
,而不是从 0 开始)。列B
中每个数字的“重新启动”列中的数字A
。对于 column 中的新数字A
,它应该启动一个新标志并将列中的相应值B
作为新范围 100 的第一个数字。为了澄清,这种情况的预期结果将是:
>>> outcome = {'ID': ['ID1', 'ID2', 'ID3', 'ID4', 'ID5', 'ID6', 'ID7', 'ID8', 'ID9', 'ID10'],
'A': [1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
'B': [145,158,240,250,199,204,300,350,467,578],
'F': ['F1','F1','F1','F2','F3','F4','F4','F5','F6','F7']}
>>> outcome
A B F
ID1 1 145 F1
ID2 1 158 F1
ID3 1 240 F1
ID4 1 250 F2
ID5 2 199 F3
ID6 2 204 F3
ID7 2 300 F4
ID8 2 350 F4
ID9 2 467 F5
ID10 2 578 F6
我希望这一切都有意义,在此先感谢!
解决方案
你可以做:
import numpy as np
df['d100'] = df.groupby('A')['B'].diff().fillna(0)
df['d100'] = df.groupby('A')['d100'].cumsum() // 100
df['F'] = np.where(df['A'].ne(df['A'].shift()) | df['d100'].ne(df['d100'].shift()), 1, 0).cumsum()
df['F'] = 'F' + df['F'].astype(str)
df.drop('d100', axis=1, inplace=True)
输出:
ID A B F
0 ID1 1 145 F1
1 ID2 1 158 F1
2 ID3 1 240 F1
3 ID4 1 250 F2
4 ID5 2 199 F3
5 ID6 2 204 F3
6 ID7 2 300 F4
7 ID8 2 350 F4
8 ID9 2 467 F5
9 ID10 2 578 F6
推荐阅读
- bash - 如何使用 sed 删除评论
- javascript - 如何通过在前端执行操作来更新 mongoDB 记录?
- visual-studio - 在 Visual Studio 2019 中,是否可以从 Intellisense 中删除条目?
- selenium - 无法创建 selenium.NewRemote
- mailkit - MailKit:如何检查已发送邮件是否已添加到“已发送”文件夹?
- javascript - Google Apps 脚本 - 从自定义菜单调用自定义函数 - 未嵌套
- node.js - Node JS 路由在托管服务器上不起作用
- spring - 如何使用@Lob 生成 NCLOB 而不是 CLOB?
- java - 如何在firebase数据库中获取与特定值配对的随机键并删除该值?
- excel - 尝试复制工作表中的所有单元格时出现错误 91。但仅适用于某些代码