我有这个问题,我有几列:ID、Date和Value.我需要按ID和日期分组,以便在一个组中,日期值彼此之间的距离不应超过7天.

数据如下所示:

df = pd.DataFrame({'id' : [1, 2, 2, 3, 3, 3, 4], 'date' : ['2019-02-28', '2019-02-27', '2019-02-28', '2019-02-1', '2019-02-2', '2019-03-20', '2019-02-28'], 'value' : ['a', 'b', 'c', 'c', 'a', 'b', 'c']})

我想要获取日期组的最早日期,并列出这些值.

我希望有这样的东西:

| id       | date       | value      |
| -------- | ---------- | ---------- |
| 1        | 2019-02-28 | ['a']      |
| 2        | 2019-02-27 | ['b', 'c'] |
| 3        | 2019-02-1  | ['c', 'a'] |
| 3        | 2019-03-20 | ['b']      |
| 4        | 2019-02-28 | ['c']      |

请注意,id组可以有多个不同的日期时间组.

我发现很难对DateTime值进行排序,同时使这个GROUPPY BY判断它旁边行的日期差是否在7天以内.

推荐答案

您可以首先使用自定义groupby.transform来确定超过7天的间隔,然后使用groupby.agg:

df['date'] = pd.to_datetime(df['date'], dayfirst=False)

group = (df.groupby('id')['date']
         .transform(lambda s: s.diff().gt('7D').cumsum())
        )

out = (df.groupby(['id', group], as_index=False)
         .agg({'date': 'min', 'value': list})
      )

输出:

   id       date   value
0   1 2019-02-28     [a]
1   2 2019-02-27  [b, c]
2   3 2019-02-01  [c, a]
3   3 2019-03-20     [b]
4   4 2019-02-28     [c]

如果您希望确保组内的所有日期都在7天内(例如,连续的日期应在7行之后拆分),则需要一个自定义函数:

def grouper(s, thresh='7D'):
    groups = []
    group = 0
    ref = s.iloc[0]
    for date in s:
        if (date-ref) >= pd.Timedelta(thresh):
            group += 1
            ref = date
        groups.append(group)
    return pd.Series(groups, index=s.index)

out = (df.groupby(['id', df.groupby('id')['date'].transform(grouper)],
                  as_index=False)
         .agg({'date': 'min', 'value': list})
      )

Python相关问答推荐

决策树分类器的基础sklearn熵和log_loss标准是否有差异?

如何在WTForm中使用back_plumates参考brand_id?

无法获得指数曲线_fit来处理日期

为什么基于条件的过滤会导致pandas中的空数据框架?

如何使用Selenium访问svg对象内部的元素

根据不同列的值在收件箱中移动数据

如何在箱形图中添加绘制线的传奇?

Pytest两个具有无限循环和await命令的Deliverc函数

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

对于一个给定的数字,找出一个整数的最小和最大可能的和

通过Selenium从页面获取所有H2元素

管道冻结和管道卸载

从dict的列中分钟

Pandas计数符合某些条件的特定列的数量

将输入聚合到统一词典中

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

处理具有多个独立头的CSV文件

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

替换现有列名中的字符,而不创建新列