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