首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas - groupby (如果符合条件)

Pandas - groupby (如果符合条件)
EN

Stack Overflow用户
提问于 2017-06-20 21:45:53
回答 2查看 3.9K关注 0票数 2

下面的数据是基于一辆面包车的GPS坐标,点火是否打开/关闭,以及在给定时间面包车离目标位置有多远。我想要确定一辆面包车是否在一个位置(<300)或附近,点火是否关闭,如果两个条件都成立,停留的时间。

在下面的示例中,我将行1-4可视化为“分组”在一起,因为它们是距离<300的连续行。第5行被单独“分组”,因为它是大于300的,而第6-8行被“分组”在一起,因为它们是距离<300的连续行。

因此,由于点火在第1-4行被关闭,我想要计算持续时间(因为面包车在给定的时间量内“停止”在该位置)。但是,其他两组(第5行和第6-8行)不应计算持续时间,因为在这些组中从未关闭过点火。

代码语言:javascript
运行
复制
df
AcctID   On_Off    Distance  Timestamp
123      On        230       12:00
123      On        30        12:02
123      Off       29        12:05
123      Off       35        12:10
123      On        3000      12:13
123      On        100       12:20
123      On        95        12:22
123      On        240       12:28

我能够对距离是否小于300 (Within_Distance)进行分类,但确定分组中至少有一行的点火是否关闭让我感到困惑。下面是最终的数据帧应该是什么样子:

代码语言:javascript
运行
复制
df['Within_Distance'] = np.where(df['Distance']<300, "Yes", "No")

df
AcctID   On_Off    Distance  Timestamp   Within_Distance    Was_Off    Within_Distance_and_Was_Off
123      On        230       12:20       Yes                Yes        Yes
123      On        30        12:02       Yes                Yes        Yes
123      Off       29        12:05       Yes                Yes        Yes
123      Off       35        12:10       Yes                Yes        Yes
123      On        3000      12:13       No                 No         No
123      On        100       12:20       Yes                No         No
123      On        95        12:22       Yes                No         No
123      On        240       12:28       Yes                No         No

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-20 22:20:10

让我们试一试:

代码语言:javascript
运行
复制
df['Within_Distance'] = np.where(df['Distance']<300, "Yes", "No")

df['Was_Off'] = df.groupby((df.Distance > 300).diff().fillna(0).cumsum())['On_Off'].transform(lambda x: 'Yes' if (x == 'Off').any() else 'No')

df['Within_Distinace_and_Was_Off']  = np.where((df['Within_Distance'] == 'Yes') & (df['Was_Off'] == 'Yes'),'Yes','No')

输出:

代码语言:javascript
运行
复制
   AcctID On_Off  Distance Timestamp Within_Distance Was_Off  \
0     123     On       230     12:00             Yes     Yes   
1     123     On        30     12:02             Yes     Yes   
2     123    Off        29     12:05             Yes     Yes   
3     123    Off        35     12:10             Yes     Yes   
4     123     On      3000     12:13              No      No   
5     123     On       100     12:20             Yes      No   
6     123     On        95     12:22             Yes      No   
7     123     On       240     12:28             Yes      No   

  Within_Distinace_and_Was_Off  
0                          Yes  
1                          Yes  
2                          Yes  
3                          Yes  
4                           No  
5                           No  
6                           No  
7                           No  
票数 3
EN

Stack Overflow用户

发布于 2017-06-20 22:24:53

首先,设置一个要使用的布尔值字段

代码语言:javascript
运行
复制
df['Off'] = df['On_Off'] == 'Off'

然后构造一个字段来标识groupby的连续行,如here所示

代码语言:javascript
运行
复制
(df['Within_Distance'] != df['Within_Distance'].shift()).cumsum()

并使用.any标识groupby中任何行的布尔值为true的位置:

代码语言:javascript
运行
复制
df['Was_Off'] = df.groupby((df['Within_Distance'] != df['Within_Distance'].shift()).cumsum())['Off'].transform(any)
Out[31]: 
   AcctID On_Off  Distance Timestamp Within_Distance    Off  Was_Off
0     123     On       230     12:00             Yes  False     True
1     123     On        30     12:02             Yes  False     True
2     123    Off        29     12:05             Yes   True     True
3     123    Off        35     12:10             Yes   True     True
4     123     On      3000     12:13              No  False    False
5     123     On       100     12:20             Yes  False    False
6     123     On        95     12:22             Yes  False    False
7     123     On       240     12:28             Yes  False    False
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44654874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档