我有以下数据框
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,则sess_glob的值应为+ 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?)
答案 0 :(得分:5)
无需循环,在首先定义要累加的列之后,可以用.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