是否有一种方法可以根据其他列减去列值?

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

enter image description here

以上是关于是否有一种方法可以根据其他列减去列值?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据Pandas中的其他列值计算每个年龄的平均值

Power Query 中是不是有一种方法可以根据基于文本值重置的两列计算运行总计?

MySQL - 根据更新其他表列值触发更新列值

Pyspark根据其他列值添加新列

Pandas:如何根据其他列值的条件对列进行求和?

根据列值更改 JTable 行的背景颜色