python - 具有后续匹配值索引的数据框列,包括从最终索引到初始索引的范围环绕方向
问题描述
如何使用特定值的后续索引创建 Dataframe 列?我知道我可以找到匹配的索引
b_Index = df[df.Type=='B'].index
c_Index = df[df.Type=='C'].index
但我需要一个包含环绕案例的解决方案,以便最终匹配后的“下一个”索引是第一个索引。
假设我有一个带有Type
系列的数据框。Type
包括值 A、B 或 C。
d = dict(Type=['A', 'A', 'A', 'C', 'C', 'C', 'A', 'A', 'C', 'A', 'B', 'B', 'B', 'A'])
df = pd.DataFrame(d)
Type
0 A
1 A
2 A
3 C
4 C
5 C
6 A
7 A
8 C
9 A
10 B
11 B
12 B
13 A
我正在寻找添加NextForwardBIndex
和NextForwardCIndex
列,以便结果是
Type NextForwardBIndex NextForwardCIndex
0 A 10 3
1 A 10 3
2 A 10 3
3 C 10 4
4 C 10 5
5 C 10 8
6 A 10 8
7 A 10 8
8 C 10 3
9 A 10 3
10 B 11 3
11 B 12 3
12 B 10 3
13 A 10 3
解决方案
这应该有效:
(df.assign(NextForwardBIndex = df.loc[df['Type'].eq('B')].groupby(df['Type']).transform(lambda x: x.index.to_series().shift(-1)),
NextForwardCIndex = df.loc[df['Type'].eq('C')].groupby(df['Type']).transform(lambda x: x.index.to_series().shift(-1)))
.fillna({'NextForwardBIndex':df['Type'].eq('B').idxmax(),'NextForwardCIndex':df['Type'].eq('C').idxmax()}))
推荐阅读
- blockchain - 中继智能合约设计
- firebase - 在 Flutter 中从 Firebase 检索用户电子邮件
- python - 如何禁用 python 脚本的多个实例?
- javascript - 如何获取three.js场景的坐标范围?
- flutter - dart 中的 async 和 async* 有什么区别?
- python - python slim 或 alpine docker 图像无法使用 pipenv 安装包
- azure - 为什么在应用服务上运行时无法连接到 Azure 应用配置,获取请求已中止:无法创建 SSL/TLS 安全通道
- laravel - 路由问题 - 在 Laravel 中找不到显示页面
- android - 无法使用 MediaStore.Audio.AudioColumns 从歌曲中提取流派元数据
- hyper-v - 为什么 Hyper-V 需要硬件虚拟化?