python - 如何将不同行的值分配给新列

标签 python pandas dataframe

我正在尝试向 Pandas 中的 DataFrame 添加一列“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]})

新列需要是每个基于“Rank”的 ID 的下一个“C_Type”,从而生成如下所示的 DataFrame:

    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_Type 分配给新列 C_End。我试过创建一个函数并使用 Apply(如下),但这花了很长时间,最终给了我一个错误。总的来说,我对 Pandas 和 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)  

最佳答案

尝试:

df['C_End'] = df.sort_values('Rank').groupby('ID')['C_Type'].transform('shift',-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

关于python - 如何将不同行的值分配给新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014193/

相关文章:

python - numpy.polyfit 与 scipy.odr

python - torch.cat 沿负维度

python - 根据两列和各自的范围值创建计数矩阵 pandas

python - Pandas 计算数据框每一列中的值

python - 在远程机器人中开发的机器人可以在私有(private)消息中工作,但不能在群组中工作

python - 附加到不同循环的 future 任务

python - Pandas :将列中的值求和到唯一值

python - 如何有条件地转换 pandas 数据框列

python - 如何对 pandas 中的组执行操作

python - 如何在 pandas 数据框的顶部添加一行?