首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将月份的间隔与其他列的值相除。

将月份的间隔与其他列的值相除。
EN

Stack Overflow用户
提问于 2020-02-05 09:48:14
回答 1查看 74关注 0票数 3

问题:我有一个数据帧记录客户的状态在一段时间内。对于每个客户(组),我想将时间间隔划分为“开始”和“结束”,以说明他们在这段时间内的状态。

例如,我有以下数据:

代码语言:javascript
运行
复制
df = pd.DataFrame({'Group': ['group1', 'group1', 'group1', 'group1', 'group1', 'group1', 'group1', 'group1',
                    'group2', 'group2', 'group2', 'group2', 'group2', 'group2', 'group2', 'group2', 'group3'],
               'Month': ['2019-05', '2019-06', '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12',
                    '2019-04', '2019-05', '2019-06', '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12'],
               'Status': ['Passive', 'Passive', 'Passive', 'Active', 'Active', 'Active', 'Passive', 'Passive',
                    'Active', 'Active', 'Passive', 'Passive', 'Passive', 'Active', 'Active', 'Active', 'Active']})

我想把它转到这个结构中:

代码语言:javascript
运行
复制
df_new = pd.DataFrame({'Group': ['group1', 'group1', 'group1', 'group2', 'group2', 'group2', 'group3'],
                   'From': ['2019-05', '2019-08', '2019-11', '2019-04', '2019-06', '2019-09', '2019-12'],
                   'To': ['2019-07', '2019-10', '2019-12', '2019-05', '2019-08', '2019-11', '2019-12'],
                   'Status': ['Passive', 'Active', 'Passive', 'Active', 'Passive', 'Active', 'Active']})

没有“状态”-variable,使用groupby和aggfunc可以很简单地在每个组中找到"min“和"max”周期。但是,我不知道如何考虑“状态”-variable。问题是这里的状态间隔是不连续的,所以如果我按“状态”分组,我总是只有两个状态组(主动和被动),并且间隔是混合的。

我正在考虑将数据框架划分为两个数据框架:一个具有“主动”状态,另一个具有“被动”状态;分别处理这两个数据帧,然后再次合并。但是这种方法似乎不那么有效:(而且由于一个客户可以有很多次是主动的和被动的,所以在每个状态组中划分间隔是非常困难的。)

有没有更好的解决办法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-05 10:00:56

使用groupbyGroup和助手系列的连续Status。对于pandas v 0.25.0+,您可以使用命名聚合minmax用于"From“和"to”,last用于“Status”:

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

df_new = (df.groupby(['Group', s])
          .agg(From=('Month', 'min'),
               To=('Month', 'max'),
               Status=('Status', 'last'))
           .reset_index(level=0))

输出

代码语言:javascript
运行
复制
         Group     From       To   Status
Status                                   
1       group1  2019-05  2019-07  Passive
2       group1  2019-08  2019-10   Active
3       group1  2019-11  2019-12  Passive
4       group2  2019-04  2019-05   Active
5       group2  2019-06  2019-08  Passive
6       group2  2019-09  2019-11   Active
6       group3  2019-12  2019-12   Active

正如@nhupn所指出的,如果使用较早版本的pandas,则可以使用以下方法完成聚合:

代码语言:javascript
运行
复制
df_new = (df.groupby(['Group', s])
          .agg({'Month': [('From', 'min'),
                          ('To', 'max')],
                'Status': [('Status', 'last')]})
          .reset_index(level=0))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60073014

复制
相关文章

相似问题

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