根据索引列表更改 pandas 列的值

Liz*_*iza 5 python dataframe pandas

我有一个 df ,其中有两列uidp,我想向现有 df 添加一个新列,或者使用附加列创建一个全新的 df ,该附加列的值基于列“uid”和索引列表的X:

x = [2, 9, 12]

x 包含我应该生成新 id 的索引,新 id 是以前的 id 的增量。因此,将有两种情况,每当遇到列表 x 中的索引时,都会生成新的 id,每当uid列中的 id 发生更改时,都会再次生成新的 id,如下所示:

     uid       expected_newid     p     

0      1       1                 10     
1      1       1                 23    
2      1       2                 20  #new id generated at index 2    
3      1       2                 40
4      2       3                 21  #newid generated as "uid" changes
5      2       3                 89
6      2       3                 45
7      3       4                 50
8      3       4                 32
9      3       5                 76  #new id generated at index 9
10     3       5                 71 
11     3       5                 90
12     3       6                 56  #new id generated at index 12
13     3       6                 87
Run Code Online (Sandbox Code Playgroud)

如果有任何不清楚的地方,请告诉我。

我可以使用以下代码管理案例,每当uid发生更改时生成新的 id

df['newid'] = (df.uid.diff() != 0).cumsum()
Run Code Online (Sandbox Code Playgroud)

但它还应该在列表 x 中提到的索引处生成 newid,如“expected_newid”列中所示

DSM*_*DSM 2

IIUC,您可以简单地扩展当前使用的条件以包括索引使用“或”的可能性x(此处写为|):

In [12]: df["newid"] = ((df.uid.diff() != 0) | (df.index.isin(x))).cumsum()

In [13]: df
Out[13]: 
    uid  expected_newid   p  newid
0     1               1  10      1
1     1               1  23      1
2     1               2  20      2
3     1               2  40      2
4     2               3  21      3
5     2               3  89      3
6     2               3  45      3
7     3               4  50      4
8     3               4  32      4
9     3               5  76      5
10    3               5  71      5
11    3               5  90      5
12    3               6  56      6
13    3               6  87      6
Run Code Online (Sandbox Code Playgroud)