是否有一种方法可以根据其他列减去列值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有一种方法可以根据其他列减去列值?相关的知识,希望对你有一定的参考价值。
我有这个数据框:
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
如果颜色列中的值发生更改(根据名称列),我想创建另一列,该列中与该颜色相关联的最后一个值与新颜色中的第一个值之间要减去。如果颜色列中的值未更改,则返回-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
请帮助我吗?
答案
以这种方式尝试
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.fillna(-999).loc[partial_df.change_status != 0]['difference']
df['difference'] = df.name.copy().map(map_difference)
df
以上是关于是否有一种方法可以根据其他列减去列值?的主要内容,如果未能解决你的问题,请参考以下文章