Python 如何分配不同的行';将s值添加到新列

Python 如何分配不同的行';将s值添加到新列,python,pandas,dataframe,Python,Pandas,Dataframe,我试图在Pandas中的数据帧中添加一列“C_End”,如下所示: df = pd.DataFrame({'ID':[123,123,123,456,456,789], 'C_ID':[8,10,35,36,40,7], 'C_Type':['New','Renew','Renew','New','Term','New'], 'Rank':[1,2,3,1,2,1]}) 新列需要是

我试图在Pandas中的数据帧中添加一列“C_End”,如下所示:

df = pd.DataFrame({'ID':[123,123,123,456,456,789],
                   'C_ID':[8,10,35,36,40,7],
                   'C_Type':['New','Renew','Renew','New','Term','New'],
                   'Rank':[1,2,3,1,2,1]})
新列需要是基于“秩”的每个ID的下一个“C_类型”,从而生成如下所示的数据帧:

    ID  C_ID C_Type Rank  C_End  
0  123     8    New    1  Renew
1  123    10  Renew    2  Renew
2  123    35  Renew    3   None
3  456    36    New    1   Term
4  456    40   Term    2   None
5  789     7    New    1   None
本质上,我想找到ID=ID和Rank=Rank+1的行,并将C_类型分配给新的列C_End。我曾尝试创建一个函数并使用Apply(如下所示),但这花了很长时间,最终给了我一个错误。总的来说,我对熊猫和Python还是新手,但我觉得必须有一个我没有看到的简单解决方案

def get_next_c_type(row):
    return df.loc[(df['id'] == row['id']) & (df['rank'] == row['rank'] + 1),'c_type']

df['c_end'] = df.apply(get_next_c_type, axis = 1)  
尝试:

或者正如@W-B所建议的:

df['C_End'] = df.sort_values('Rank').groupby('ID')['C_Type'].shift(-1)
输出:

    ID  C_ID C_Type  Rank  C_End
0  123     8    New     1  Renew
1  123    10  Renew     2  Renew
2  123    35  Renew     3    NaN
3  456    36    New     1   Term
4  456    40   Term     2    NaN
5  789     7    New     1    NaN
这里有一种方法:


为什么不干脆
df.groupby('ID').C_Type.shift(-1)
我认为这不能满足
ID=ID和Rank=Rank+1
@W-B我确实认为我们应该按秩包括sort_值,以确保获得下一个秩的C_类型的条件。但是,
df.sort_值('Rank').groupby('ID')['C_Type'].shift(-1)
也可以使用。:)谢谢
    ID  C_ID C_Type  Rank  C_End
0  123     8    New     1  Renew
1  123    10  Renew     2  Renew
2  123    35  Renew     3    NaN
3  456    36    New     1   Term
4  456    40   Term     2    NaN
5  789     7    New     1    NaN
dfs = df.shift(-1)
m1 = df.ID == dfs.ID
m2 = df.Rank + 1 == dfs.Rank
df.loc[:, 'C_End'] = np.where(m1 & m2, dfs.C_Type, None)

   ID    C_ID C_Type  Rank C_End
0  123     8    New     1  Renew
1  123    10  Renew     2  Renew
2  123    35  Renew     3   None
3  456    36    New     1   Term
4  456    40   Term     2   None
5  789     7    New     1   None