Pandas中满足一定条件的序号如何相加

h9a6wy2h  于 2023-03-11  发布在  其他
关注(0)|答案(2)|浏览(152)

如果满足某些条件,则需要增加序号,否则需要保留以前的序号。
原始数据集:
| 识别号|姓名|现况|集群|差距|
| - ------|- ------|- ------|- ------|- ------|
| 1个|A类|无|1个|十五|
| 1个|B|1个|1个|三十五|
| 1个|C级|1个|1个|03|
| 第二章|B|无|1个|二十六|
| 第二章|C级|无|1个|十六|
| 三个|A类|1个|1个|六十五|
| 三个|C级|无|1个|八十九|
| 三个|F级|无|1个|十九|
所需数据集:
| 识别号|姓名|现况|集群|差距|
| - ------|- ------|- ------|- ------|- ------|
| 1个|A类|无|1个|十五|
| 1个|B|1个|第二章|三十五|
| 1个|C级|1个|三个|03|
| 第二章|B|无|1个|二十六|
| 第二章|C级|无|1个|十六|
| 三个|A类|1个|1个|六十五|
| 三个|C级|无|第二章|八十九|
| 三个|F级|无|第二章|十九|
条件:
1.对于第一次出现的ID,群集应为1。
1.如果status = 1或Gap〉28,则群集需要根据患者ID增加1(参见第1-C和2-B行---随着ID的变化,群集保持为1,因为它是特定ID的第一次出现)。
1.如果不满足条件,则需要保存前一个聚类号(可以引用最后一行)。
我尝试的代码是:

Original_dataset.loc[((new_df4['gap'] > 28) | (Original_dataset['status'] == 1)),'Cluster'] = Original_dataset['Cluster'] + 1
wlzqhblo

wlzqhblo1#

如果较大的GAP类似于28,或者如果Status1IDDataFrame.loc中的第一个重复值,则首先设置1,然后对GroupBy.cumsumGroupBy.ffill使用lambda函数

m = df['Gap'].gt(28)
m1 = df['Status'].eq(1)
m2 = ~df['ID'].duplicated()

df.loc[m | m1 | m2, 'Cluster1'] = 1

f = lambda x: x.cumsum().ffill(downcast='int')
df['Cluster1'] = df.groupby('ID')['Cluster1'].transform(f)
print (df)
   ID Name  Status  Cluster  Gap  Cluster1
0   1    A       0        1   15         1
1   1    B       1        1   35         2
2   1    C       1        1    3         3
3   2    B       0        1   26         1
4   2    C       0        1   16         1
5   3    A       1        1   65         1
6   3    C       0        1   89         2
7   3    F       0        1   19         2
s4chpxco

s4chpxco2#

您可以使用基于3个条件的掩码,以及简单的groupby.cumsum

# is Gap≥28 OR Status==1 OR first ID ?
m = df['Gap'].ge(28) | df['Status'].eq(1) | ~df['ID'].duplicated()

# then increment count per group
df['Cluster'] = m.groupby(df['ID']).cumsum()

输出:

ID Name  Status  Cluster  Gap
0   1    A       0        1   15
1   1    B       1        2   35
2   1    C       1        3    3
3   2    B       0        1   26
4   2    C       0        1   16
5   3    A       1        1   65
6   3    C       0        2   89
7   3    F       0        2   19

相关问题