Python 如何分配不同的行';将s值添加到新列
我试图在Pandas中的数据帧中添加一列“C_End”,如下所示: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]}) 新列需要是
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