我有这个数据框:
name color number
0 john red 4
1 ana red 4
2 ana red 5
3 paul red 6
4 mark red 3
5 ana yellow 10
6 john yellow 11
7 john yellow 12
8 john red 13
如果color列中的值发生更改(根据name列),我想创建另一列,该列中与该颜色关联的最后一个值与新颜色的第一个值之间要减去。如果颜色列中的值未更改,则返回-999。 例如: 寻找ana,红色的最后一个值为5,黄色的第一个值为10。因此,新列将成为ana的10-5 = 5。 期待john,红色的最后一个值为4,黄色的第一个值为11。因此,对于john,新列将为11-4 = 7。只做一次。如果颜色再次更改,则不会继续。
我想要这个输出:
name color number difference
0 john red 4 7
1 ana red 4 5
2 ana red 5 5
3 paul red 6 -999
4 mark red 3 -999
5 ana yellow 10 5
6 john yellow 11 7
7 john yellow 12 7
8 john red 13 7
请帮助我吗?
答案 0 :(得分:2)
以这种方式尝试
df = pd.DataFrame({'name':['john','ana','ana','paul','mark','ana','john','john','john'],
'color':['red','red','red','red','red','yellow','yellow','yellow','red'],
'number':[4,4,5,6,3,10,11,12,13]})
df['color_code'] = df['color'].factorize()[0]
partial_df = pd.DataFrame()
partial_df['difference'] = df.groupby('name')['number'].apply(lambda x: list(np.diff(x))).explode()
partial_df['change_status'] = df.groupby('name')['color_code'].apply(lambda x: list((np.diff(x)>0)+0)).explode()
map_difference = partial_df.loc[partial_df.change_status != 0].reset_index().drop_duplicates('name').set_index('name')['difference']
df['difference'] = df.name.copy().map(map_difference).fillna(-999)
df