首页 > 解决方案 > 具有后续匹配值索引的数据框列,包括从最终索引到初始索引的范围环绕方向

问题描述

如何使用特定值的后续索引创建 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

我正在寻找添加NextForwardBIndexNextForwardCIndex列,以便结果是

   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

标签: pythonpandas

解决方案


这应该有效:

(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()}))

推荐阅读