【问题标题】:grouping based on rolling conditions基于滚动条件的分组
【发布时间】:2019-10-20 22:04:47
【问题描述】:

我正在尝试根据几个条件对数据框进行分组。

数据框:

Start Date  End Date    value
1971-07-01  1971-07-31  0.0
1971-08-01  1971-08-31  0.25
1971-09-01  1971-09-30  -0.62
1971-10-01  1971-10-31  0.0
1971-11-01  1971-11-30  -0.63
1971-12-01  1971-12-31  -1.0
1972-01-01  1972-01-31  0.0
1972-02-01  1972-02-29  0.0
1972-03-01  1972-03-31  2.0
1972-04-01  1972-04-30  0.0
.
.
1973-07-01  1973-07-31  2.0
1973-08-01  1973-08-31  0.5
1973-09-01  1973-09-30  -2.0
1973-10-01  1973-10-31  0.0
1973-11-01  1973-11-30  0.0
1973-12-01  1973-12-31  0.0
1974-01-01  1974-01-31  0.0
1974-02-01  1974-02-28  0.0
.
.
.
1974-11-01  1974-11-30  0.0
1974-12-01  1974-12-31  -1.25
1975-01-01  1975-01-31  -1.0
1975-02-01  1975-02-28  -1.0
1975-03-01  1975-03-31  -0.5
1975-04-01  1975-04-30  -0.25
1975-05-01  1975-05-31  0.0
1975-06-01  1975-06-30  1.25
1975-07-01  1975-07-31  0.0
1975-08-01  1975-08-31  0.0

分组标准

组应始终以负值开头

只要我们有负值就继续

如果我们达到正值三个连续的零,则该组结束

上述数据框中的示例 1

1971-09-01  1971-09-30  -0.62
1971-10-01  1971-10-31  0.0
1971-11-01  1971-11-30  -0.63
1971-12-01  1971-12-31  -1.0
1972-01-01  1972-01-31  0.0
1972-02-01  1972-02-29  0.0

示例 2(在这种情况下,我们达到了 3 个连续的零)

1973-09-01  1973-09-30  -2.0
1973-10-01  1973-10-31  0.0
1973-11-01  1973-11-30  0.0
1973-12-01  1973-12-31  0.0

示例 3(在这种情况下我们达到了正值)

1974-12-01  1974-12-31  -1.25
1975-01-01  1975-01-31  -1.0
1975-02-01  1975-02-28  -1.0
1975-03-01  1975-03-31  -0.5
1975-04-01  1975-04-30  -0.25
1975-05-01  1975-05-31  0.0

我没有任何代码,因为我仍在研究如何将条件放入 groupby 或任何其他有效的方法来做到这一点。

我尝试了 for 循环,但我不会去任何地方。

for i in df.index:
    no = 0
    if df['Value'][i] < 0:
        df['groupno'] = no

分组后,我想获取分组第一列的开始日期和分组最后一列的结束日期。

预期结果(来自示例):

Start Date   End Date
1971-09-01   1972-02-29
1973-09-01   1973-12-31
1974-12-01   1975-05-31

感谢阅读。

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    我认为这不是 Python 的方式,但它有效,我认为它对你有帮助。

    groups = []
    start = '' # start date for group
    end = '' # end date for group
    nulls = 0 # count of nulls
    for j,i in df.iterrows():
        # if it's first negativa value - start the group
        if i.value < 0 and start == '':
            start = i['Start Date']
            nulls = 0
        # if it's null - remember that
        if i.value == 0:
            nulls += 1
        else:
            nulls = 0
        # if value > 0 or we have seen 3 nulls - end group (if it was start)
        if ( (i.value > 0) or (nulls == 3) ) and start != '':
            # if we have seen 3 nulls - we want write this end date (not previous)
            if nulls == 3:
                end = i['End Date']
            groups.append((start, end))
            start = ''
            nulls = 0
        if nulls == 3:
            start = ''
            nulls = 0
        # remember previous end date
        end = i['End Date']
    result = pd.DataFrame(groups, columns = ['Start Date', 'End Date'])
    print(result)
    

    不是group by,但它可以帮助您找到小组的开始和结束日期。

    输出:

       Start Date    End Date
    0  1971-09-01  1972-02-29
    1  1973-09-01  1973-12-31
    2  1974-12-01  1975-05-31
    

    【讨论】:

    • 感谢您的回答
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2021-12-28
    • 2021-08-28
    相关资源
    最近更新 更多