如何组合,循环并获得结果作为熊猫的数据框架

问题描述 投票:0回答:1

我有以下数据帧

   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?

python pandas
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.