我正在尝试向 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/