如何在熊猫中分组、循环和获取结果作为数据框
Posted
技术标签:
【中文标题】如何在熊猫中分组、循环和获取结果作为数据框【英文标题】:How to groupby, loop and get result as a dataframe in panda 【发布时间】:2019-07-12 01:13:43 【问题描述】:我有以下数据框
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?)
【问题讨论】:
代码不可避免地会变慢,因为这里df1 = pd.concat([df1, data.to_frame().T])
每次进入循环时都会创建一个新的DataFrame。尝试重构那段代码,只在最后将更新的值转储到一个新的 DataFrame 中(也许将它们存储在字典中,因为它可以很好地与 pandas 配合使用?)
【参考方案1】:
不需要循环,你需要的可以用.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
【讨论】:
以上是关于如何在熊猫中分组、循环和获取结果作为数据框的主要内容,如果未能解决你的问题,请参考以下文章