我有以下数据帧
location tps_inter sess_glob
0 loc1 0 0
1 loc1 79 0
2 loc1 3 0
3 loc1 17 0
4 loc2 0 0
5 loc2 46 0
6 loc3 0 0
我想按位置分组,并为每组的第一行添加1。
location tps_inter sess_glob
0 loc1 0 1
1 loc1 79 0
2 loc1 3 0
3 loc1 17 0
4 loc2 0 1
5 loc2 46 0
6 loc3 0 1
然后对于每个组,我想根据tps_inter的值添加索引。如果tps_inter小于10,则sess_glob应与之前的值相同,如果它大于10,则相同值+ 1。
期望的结果是
location tps_inter sess_glob
0 loc1 0 1
1 loc1 79 2
2 loc1 3 2
3 loc1 17 3
4 loc2 0 1
5 loc2 46 2
6 loc3 0 1
此代码正在运行,但当行数增加时,它变得非常慢
df1 = df.copy()
df1 = df1.iloc[0:0]
gdf = df.groupby('location')
i = 1
for table, group in gdf:
for row, data in group.iterrows():
if data["tps_inter"] > 10 :
i = i + 1
data['sess_glob'] = i
df1 = pd.concat([df1, data.to_frame().T])
i = 1
我认为有一种更好的方法可以在没有连接线的情况下完成它,但我找不到它。我遇到的主要问题是在Dataframe中得到结果而不是串行。
(我使用以下问题编写我的代码How to loop over grouped Pandas dataframe?)
不需要循环,在首先定义我们将总结的列之后,可以使用.cumsum
完成所需的操作:
import numpy as np
df['sess_glob'] = (df.assign(to_csum = np.where(df['tps_inter'].lt(10), 0, 1))
.groupby('location').to_csum.cumsum()+1)
#or
#df['sess_glob'] = (df.assign(to_csum = df['tps_inter'].ge(10))
# .groupby('location').to_csum.cumsum()+1).astype(int)
location tps_inter sess_glob
0 loc1 0 1
1 loc1 79 2
2 loc1 3 2
3 loc1 17 3
4 loc2 0 1
5 loc2 46 2
6 loc3 0 1