pandas - 计算最近出现的状态 - Pandas
问题描述
对于以下问题,我有一种不优雅的解决方案,我想知道是否有更好的方法来处理以下类型的数据集,
我有一个大约 150k 行的小数据集,其中有 3 个基本行,我正在尝试解决:
ID Status Week
1 base 1
1 over 2
1 base 3
1 over 4
1 over 5
1 under 6
计算 的最终出现次数的最有效方法是over
什么?
本质上,对于上面的数据集,我会说ID == 1
是Status
over
从一周开始,4
总共持续了两周,4
并且5
.
df
我目前的方法是按ID
and对我的排序Week
,然后groupby.tail()
获取最后出现的 over 和 under 并总结周的差异。
我觉得有点傻,因为我确定这是一个简单的问题..!
目标数据集
ID Duration of Last-Over, Start-Week, End-Week
1, 2, 4, 5
原始数据框:
ID, Budget, Spend, Week, Status
1, 50, 50, 1, base
1 50, 55, 2, over
1 50, 50, 3, base
1 50, 250, 4, over
1 50, 300, 5, over
1 50, 42, 6, under.
解决方案
下面的代码分两步完成:
last = df[df.Status == 'over'][::-1][0:1].index
before_last = df[df.Status == 'over'][::-1][1:2].index
diff = df.iloc[last,3].values - df.iloc[before_last,3].values +1
ID = df.iloc[last,0]
new_df = pd.DataFrame({'ID': {0: ID.values[0]},
'Duration of Last-Over': {0: diff[0]},
'Start-Week': {0: df.iloc[before_last]['Week'].values[0]},
'End-Week': {0: df.iloc[last]['Week'].values[0]}})
产生这个输出:
编辑:也许是一个更简单的答案:
仅获取最后两次出现的“过度”并对其进行操作。
df_aux = df[df.Status == 'over'].tail(2)
new_df = pd.DataFrame({'ID': {0: df_aux.iloc[1,0]},
'Duration of Last-Over': {0: df_aux.iloc[1,3] - df_aux.iloc[0,3] +1},
'Start-Week': {0: df_aux.iloc[0,3]},
'End-Week': {0: df_aux.iloc[1,3]}})
推荐阅读
- php - PHP Logger VPN / Proxy 通过 file_get_contents 和 preg_match 检测
- html - 如何使输入字段仅与可用空间一样宽?
- html - react js内联样式中是否有标签样式
- javascript - Bootstrap 4自定义文件上传未在标签中显示文件名
- r - 编织 Rmarkdown 文件时出错 - 安装 tidyverse 后发生
- php - Laravel 流明没有正确更新
- azure - Azure 工件 - 下载通用工件的特定版本
- sql - 更新在数据库中存储为字符串的 XML 节点
- python-3.x - 如何读取文本数据并转换为 pandas 数据框
- java - 当作者说 - “两个线程试图同时执行一段代码”时,这是什么意思?