python - 如何在熊猫中分组、循环和获取结果作为数据框
问题描述
我有以下数据框
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 中而不是在系列中获得结果。
(我使用以下问题编写代码 如何循环分组 Pandas 数据帧?)
解决方案
无需循环,.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
推荐阅读
- java - io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
- python - Telethon 问题:NameError:未定义名称“事件”
- python - 使用双进度条时 tqdm 打印新行
- flutter - 如何在flutter中导入和使用包?
- reactjs - React hooks-如何使用变量在下拉列表中设置选项
- tensorflow - max_pool2d的参数是什么意思?
- c# - 有没有办法在文本块/文本框对象中选择多行字符串的单行/单词?
- scala - 如何在 Scala 中使用案例类进行映射
- reactjs - 如何从浏览器的地址栏中删除不正确的路由并重定向到 hookrouter 中的 Home 路由?
- javascript - 为什么打开模式时'$el.clientWidth'等于0?(Vue.js)