Python 熊猫按列值分组,所有值都小于某些数字,并将组号指定为新列

Python 熊猫按列值分组,所有值都小于某些数字,并将组号指定为新列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个这样的数据框 df col1 col2 A 2 B 3 C 1 D 4 E 6 F 1 G 2 H 8 I 1 J 10 现在我想创建另一列col3,将所有小于5的col2值分组,并将col3值保持为1,以组数为单位,因此最终的数据帧如下所示 col1 col2 col3 A 2

我有一个这样的数据框

df
col1    col2
 A        2
 B        3
 C        1
 D        4
 E        6
 F        1
 G        2
 H        8
 I        1
 J       10
现在我想创建另一列col3,将所有小于5的col2值分组,并将col3值保持为1,以组数为单位,因此最终的数据帧如下所示

col1    col2     col3
 A        2        1
 B        3        1
 C        1        1
 D        4        1
 E        6        2
 F        1        2
 G        2        2
 H        8        3
 I        1        3
 J       10        4
我可以将上一个值与当前值进行比较,并将其存储到列表中,使其成为col3

但是在这种情况下,执行时间将是巨大的,因此要寻找一些快捷方式/Python方式来最有效地执行。

比较for
,然后使用。新列总是以
0
开头,因为列的第一个值不像
5
,否则它应该是
1

df['col3'] = df['col2'].gt(5).cumsum()
print (df)
  col1  col2  col3
0    A     2     0
1    B     3     0
2    C     1     0
3    D     4     0
4    E     6     1
5    F     1     1
6    G     2     1
7    H     8     2
8    I     1     2
9    J    10     3
因此,对于从
1
开始的一般解决方案,使用此技巧-比较第一个值(如果不太像
5
),将
True->1
False->0
转换为整数,并添加到列中:

N = 5
df['col3'] = df['col2'].gt(N).cumsum() + int(df.loc[0, 'col2'] < 5)
N=5
df['col3']=df['col2'].gt(N.cumsum()+int(df.loc[0,'col2']<5)

df=df.assign(col21=df['col2'].add(pd.Series({0:5}),fill_value=0.astype(int))
N=5
df['col3']=df['col2'].gt(N).cumsum()+int(df.loc[0,'col2']5
df['col31']=df['col21'].gt(N.cumsum()+int(df.loc[0,'col21']
df = df.assign(col21 = df['col2'].add(pd.Series({0:5}), fill_value=0).astype(int))

N = 5
df['col3'] = df['col2'].gt(N).cumsum() + int(df.loc[0, 'col2'] < N)
#test for first value > 5
df['col31'] = df['col21'].gt(N).cumsum() + int(df.loc[0, 'col21'] < N)
print (df)
  col1  col2  col21  col3  col31
0    A     2      7     1      1
1    B     3      3     1      1
2    C     1      1     1      1
3    D     4      4     1      1
4    E     6      6     2      2
5    F     1      1     2      2
6    G     2      2     2      2
7    H     8      8     3      3
8    I     1      1     3      3
9    J    10     10     4      4