python - Pandas - 如果满足条件则进行分组

标签 python pandas group-by pandas-groupby

以下数据基于货车的 GPS 坐标、点火装置是否打开/关闭以及货车在给定时间距目标位置的距离。我想确定货车是否位于或靠近某个位置 (<300)、点火开关是否关闭,以及如果两个条件都成立,则确定停留的持续时间。

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

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

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) 进行分类,但确定分组中至少一行的点火装置是否关闭却让我感到困惑。最终数据框应如下所示:

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

提前致谢!

最佳答案

让我们尝试一下:

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')

输出:

   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  

关于python - Pandas - 如果满足条件则进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654874/

相关文章:

python - 如何将多个数组减为一个?

python - 对列表中的行进行分组并转置 pandas

python - 在 pandas 中按组替换列/系列

mysql - group by 正在摆脱一些行?

oracle - 如何获得 COUNT(col) ... GROUP BY 来使用索引?

python - 将ffmpeg安装到虚拟环境

python - python 3.4 中不包含“setuptools”模块?

python - 需要了解如何将数据分成同一图表上的两条单独的线

python - 乘以 Pandas 中的前导对角线值?

pandas - groupby pandas 在特定条件下求均值和总和