如何使用pandas groupby在每个分组中添加一行?

6
我希望在每个分组的第一行中添加一个新行,我的原始数据框如下:
```html

我希望在每个分组的第一行中添加一个新行,我的原始数据框如下:

```
df = pd.DataFrame({
    'ID': ['James', 'James', 'James','Max', 'Max', 'Max', 'Max','Park','Tom', 'Tom', 'Tom', 'Tom','Wong'],
    'From_num': [78, 420, 'Started', 298, 36, 298, 'Started', 'Started', 60, 520, 99, 'Started', 'Started'],
    'To_num': [96, 78, 420, 36, 78, 36, 298, 311, 150, 520, 78, 99, 39],
    'Date': ['2020-05-12', '2020-02-02', '2019-06-18',
             '2019-06-20', '2019-01-30', '2018-10-23',
             '2018-08-29', '2020-05-21', '2019-11-22',
             '2019-08-26', '2018-12-11', '2018-10-09', '2019-02-01']})

它就像这样:

      ID From_num  To_num        Date
0   James       78      96  2020-05-12
1   James      420      78  2020-02-02
2   James  Started     420  2019-06-18
3     Max      298      36  2019-06-20
4     Max       36      78  2019-01-30
5     Max      298      36  2018-10-23
6     Max  Started     298  2018-08-29
7    Park  Started     311  2020-05-21
8     Tom       60     150  2019-11-22
9     Tom      520     520  2019-08-26
10    Tom       99      78  2018-12-11
11    Tom  Started      99  2018-10-09
12   Wong  Started      39  2019-02-01

对于每个人('ID'),我希望在每个组('ID')的第一行上创建一个新的重复行,所创建行中'ID'、'From_num'和'To_num'的值应与上一个第一行相同,但'Date'的值为旧的第一行的'Date'加上一天。例如对于James来说,新创建的行的值是:'James' '78' '96' '2020-05-13',其余数据相同,因此我的期望结果是:
       ID From_num  To_num        Date
0   James       78      96  2020-05-13  # row added, Date + 1
1   James       78      96  2020-05-12
2   James      420      78  2020-02-02
3   James  Started     420  2019-06-18
4     Max      298      36  2019-06-21  # row added, Date + 1
5     Max      298      36  2019-06-20
6     Max       36      78  2019-01-30
7     Max      298      36  2018-10-23
8     Max  Started     298  2018-08-29
9    Park  Started     311  2020-05-22  # Row added, Date + 1
10   Park  Started     311  2020-05-21
11    Tom       60     150  2019-11-23  # Row added, Date + 1
12    Tom       60     150  2019-11-22
13    Tom      520     520  2019-08-26
14    Tom       99      78  2018-12-11
15    Tom  Started      99  2018-10-09
16   Wong  Started      39  2019-02-02  # Row added Date + 1
17   Wong  Started      39  2019-02-01

我编写了一些循环条件,但是运行速度相当慢,如果你有什么好的想法,请帮忙。非常感谢。

1个回答

4

我们来试试这里的 groupby.apply。我们将在每个组的开头附加一行,就像这样:

def augment_group(group):
    first_row = group.iloc[[0]]
    first_row['Date'] += pd.Timedelta(days=1) 
    return first_row.append(group)

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
(df.groupby('ID', as_index=False, group_keys=False)
   .apply(augment_group)
   .reset_index(drop=True))

       ID From_num  To_num       Date
0   James       78      96 2020-05-13
1   James       78      96 2020-05-12
2   James      420      78 2020-02-02
3   James  Started     420 2019-06-18
4     Max      298      36 2019-06-21
5     Max      298      36 2019-06-20
6     Max       36      78 2019-01-30
7     Max      298      36 2018-10-23
8     Max  Started     298 2018-08-29
9    Park  Started     311 2020-05-22
10   Park  Started     311 2020-05-21
11    Tom       60     150 2019-11-23
12    Tom       60     150 2019-11-22
13    Tom      520     520 2019-08-26
14    Tom       99      78 2018-12-11
15    Tom  Started      99 2018-10-09
16   Wong  Started      39 2019-02-02
17   Wong  Started      39 2019-02-01

虽然我同意评论中的@Joran Beasley的观点,认为这似乎是一个XY问题。也许尝试澄清您要解决的问题,而不是询问如何实现您认为是解决问题的方案?


感谢@cs95的回答,对于我的实际情况来说,这是跟踪丢失记录的一部分,之后我还需要修改数据的其余记录,这是我可以处理的事情,但这个问题让我变得非常高效。非常感谢您的回答。 - XaviorL
@XaviorL 我明白了... 你是和原帖作者共同完成这个任务吗? - cs95
是的,我们是同一个团队的新成员。谢谢。 - XaviorL
@XaviorL,团队代表提问并不罕见,其他团队成员也会关注。然而,小小的建议是要注意不要让整个团队投票支持你的队友的问题。这构成了串通/有针对性的投票,这是不被鼓励的。我并不是在指责你,只是想分享一些建议,因为我以前看到过太多次了。祝好!很高兴能帮到你! - cs95
哦,抱歉@cs95,我们是同一团队的新毕业生伙伴,一起得到了新角色。没有意识到这可能会引起问题,现在将删除此问题。 - XaviorL
@XaviorL 请不要删除这个问题,我们不希望你的问题和我的回答付诸东流;-) 未来的读者可能会从这个问题中受益。这只是一些未来的建议。 - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接