比较2个连续行并指定增加值(如果不同)(使用Pandas)

时间:2016-12-05 17:17:53

标签: python pandas dataframe replace compare

我有一个像这样的数据帧df_in:

import pandas as pd
dic_in = {'A':['aa','aa','bb','cc','cc','cc','cc','dd','dd','dd','ee'],
       'B':['200','200','200','400','400','500','700','700','900','900','200'],
       'C':['da','cs','fr','fs','se','at','yu','j5','31','ds','sz']}
df_in = pd.DataFrame(dic_in)

我想以下列方式调查2列A和B. 我连续2 rows[['A','B']]相等,然后为它们分配一个新值(根据我将要描述的特定规则)。 我将举一个例子来说明一点:如果第一个row[['A','B']]等于下一个,那么我设置1;如果第二个等于第三个,那么我将设置1。每当两个连续的行不同时,我会将值增加到1

结果应如下所示:

     A    B   C  value
0   aa  200  da      1
1   aa  200  cs      1
2   bb  200  fr      2
3   cc  400  fs      3
4   cc  400  se      3
5   cc  500  at      4
6   cc  700  yu      5
7   dd  700  j5      6
8   dd  900  31      7
9   dd  900  ds      7
10  ee  200  sz      8

你能建议我做一个聪明的人来实现这个目标吗?

1 个答案:

答案 0 :(得分:8)

使用shiftany比较连续的行,使用True指示值应更改的位置。然后将累计和与cumsum一起使用以获得增加的值:

df_in['value'] = (df_in[['A', 'B']] != df_in[['A', 'B']].shift()).any(axis=1)
df_in['value'] = df_in['value'].cumsum()

或者,将其浓缩成一行:

df_in['value'] = (df_in[['A', 'B']] != df_in[['A', 'B']].shift()).any(axis=1).cumsum()

结果输出:

     A    B   C  value
0   aa  200  da      1
1   aa  200  cs      1
2   bb  200  fr      2
3   cc  400  fs      3
4   cc  400  se      3
5   cc  500  at      4
6   cc  700  yu      5
7   dd  700  j5      6
8   dd  900  31      7
9   dd  900  ds      7
10  ee  200  sz      8