pandas中聚合字符串列的关闭时间

km0tfn4u  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(92)

我正在尝试对消息进行分组,这些消息是在短时间内发送的。一个参数定义了消息之间的最大持续时间,以便将它们视为块的一部分。如果将消息添加到块中,则时间窗口将延长,以便将更多消息视为块的一部分。

示例输入

| | 消息| message |
| --|--|--|
| 0 |2023-01-01 12:00:00|一|
| 1 |2023-01-01 12:20:00| B|
| 2 |2023-01-01 12:30:00| C|
| 3 |2023-01-01 12:30:55| D|
| 4 |2023-01-01 12:31:20| E|
| 5 |2023-01-01 15:00:00| F|
| 6 |2023-01-01 15:30:30| G|
| 7 |2023-01-01 15:30:55| H|

参数设置为1 min时的预期输出

| | 消息|datetime_last| n块| n_block |
| --|--|--|--|--|
| 0 |2023-01-01 12:00:00|一|2023-01-01 12:00:00| 1 |
| 1 |2023-01-01 12:20:00| B| 2023-01-01 12:20:00| 1 |
| 2 |2023-01-01 12:30:00| C\n D\n E| 2023-01-01 12:31:20| 3 |
| 3 |2023-01-01 15:00:00| F| 2023-01-01 15:00:00| 1 |
| 4 |2023-01-01 15:30:30|公司简介|2023-01-01 15:30:55| 2 |

我失败的尝试

我希望通过滚动窗口来实现这一点,滚动窗口将不断追加消息行。

def join_messages(x):
    return '\n'.join(x)

df.rolling(window='1min', on='datetime').agg({
  'datetime': ['first', 'last'], 
  'message': [join_messages, "count"]}) #Somehow overwrite datetime with the aggregated datetime.first.

字符串
两个聚合都在ValueError:invalid on specified as datetime, must be a column (of DataFrame), an Index or None上失败。
我没有看到一个干净的方法来让datetime在Window中“可访问”。此外,滚动也不能很好地处理字符串。我的印象是,这是一个死胡同,有一个更干净的方法来解决这个问题。
输入和预期数据的片段

df = pd.DataFrame({
    'datetime': [pd.Timestamp('2023-01-01 12:00'),
                 pd.Timestamp('2023-01-01 12:20'),
                 pd.Timestamp('2023-01-01 12:30:00'),
                 pd.Timestamp('2023-01-01 12:30:55'),
                 pd.Timestamp('2023-01-01 12:31:20'),
                 pd.Timestamp('2023-01-01 15:00'),
                 pd.Timestamp('2023-01-01 15:30:30'),
                 pd.Timestamp('2023-01-01 15:30:55'),],
    'message': list('ABCDEFGH')})

df_expected = pd.DataFrame({
    'datetime': [pd.Timestamp('2023-01-01 12:00'),
                 pd.Timestamp('2023-01-01 12:20'),
                 pd.Timestamp('2023-01-01 12:30:00'),
                 pd.Timestamp('2023-01-01 15:00'),
                 pd.Timestamp('2023-01-01 15:30:30'),],
    'message': ['A', 'B', 'C\nD\nE', 'F', 'G\nH'],
    'datetime_last': [pd.Timestamp('2023-01-01 12:00'),
                      pd.Timestamp('2023-01-01 12:20'),
                      pd.Timestamp('2023-01-01 12:31:20'),
                      pd.Timestamp('2023-01-01 15:00'),
                      pd.Timestamp('2023-01-01 15:30:55'),],
    'n_block': [1, 1, 3, 1, 2]})

6l7fqoea

6l7fqoea1#

比较当前和以前的日期时间值,以标记差异大于1 min的行,然后在标记上应用累积和,以区分不同的日期时间块。现在,按这些块对字符串进行分组并聚合以获得结果

m = df['datetime'].diff() > pd.Timedelta(minutes=1)
df.groupby(m.cumsum(), as_index=False).agg(datetime=('datetime', 'first'),
                                           datetime_last=('datetime', 'last'),
                                           message=('message', '\n'.join),
                                           n_block=('message', 'count'))

个字符

相关问题