在数据帧中合并行

2024-09-25 00:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建新的数据帧(或更新此数据帧)。怎么做
如果用户在一行中有'Date\u start',在另一行中有'Date\u end+1秒',则应将其合并为一行。所以,对于第一个用户XXX,使用下面的数据帧,我希望将前3行合并为一行。 此外,仅当用户及其日期在同一组中时,才应执行此操作

      Group   Date      User    Date_start            Date_end
1       A   2018-09-20  XXX 2018-09-20 00:01:35 2018-09-20 00:59:59
2       A   2018-09-20  XXX 2018-09-20 01:00:00 2018-09-20 01:59:59
3       A   2018-09-20  XXX 2018-09-20 02:00:00 2018-09-20 02:18:10
4       A   2018-09-20  XXY 2018-09-20 00:00:19 2018-09-20 00:59:59
5       A   2018-09-20  XXY 2018-09-20 01:00:00 2018-09-20 01:09:26
6       B   2018-09-20  XXZ 2018-09-20 00:28:39 2018-09-20 00:59:59
... ... ... ... ... ...
1999996 A   2018-09-20  ZZX 2018-09-20 00:00:08 2018-09-20 00:59:59
1999997 B   2018-09-20  ZZX 2018-09-20 01:00:00 2018-09-20 01:59:59
1999998 A   2018-09-20  ZZY 2018-09-20 00:04:22 2018-09-20 00:59:59
1999999 B   2018-09-20  ZZZ 2018-09-20 00:00:54 2018-09-20 00:59:59
2000000 A   2018-09-20  ZZZ 2018-09-20 01:00:00 2018-09-20 01:59:59

以下是用户XXX应该做的事情(前3行合并成一行):

1       A   2018-09-20  XXX 2018-09-20 00:01:35 2018-09-20 02:18:10

Tags: 数据用户dategroup事情startxxxend
1条回答
网友
1楼 · 发布于 2024-09-25 00:30:31

IIUC,这可以使用groupby来完成。首先,我将时间从字符串转换为日期时间:

df['Date_start'] = pd.to_datetime(df['Date_start'])
df['Date_end'] = pd.to_datetime(df['Date_end'])

其次,使用groupby操作生成一个函数来apply。我们将按UserGroup分组,以组合它们的时间:

def mygroup(d):
    out = d.iloc[0, :]                    # take the first row of each group
    x = df.columns.get_loc('Date_end')    # get iloc position of date_end
    out.loc['Date_end']  = d.iloc[-1, x]  # replace the first rows date_end with that of the last row
    return out

最后,apply调用函数并重置索引:

df = df.groupby(['Group', 'User']).apply(mygroup).reset_index(drop=True)

前5行的输出:

  Group        Date User          Date_start            Date_end
0     A  2018-09-20  XXX 2018-09-20 00:01:35 2018-09-20 02:18:10
1     A  2018-09-20  XXY 2018-09-20 00:00:19 2018-09-20 01:09:26

请注意,这并不是利用您提到的“前1秒”方面。我想如果每个User&Group组合,有多个时间序列需要分组。在这种情况下,如果有一个额外的步骤来创建一个新的列来标记要分组的每个时间段,那么仍然可以使用这种方法——这可能不是最简单的操作,但应该是可能的

相关问题 更多 >