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

时间:2020-05-21 00:56:09

标签: python pandas dataframe

我有这个数据框:

  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

请帮助我吗?

1 个答案:

答案 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

enter image description here