我有一个数据框,其值如下:
╔════╦═════════╦══════╦═══════╗
║ id ║ quarter ║ year ║ value ║
╠════╬═════════╬══════╬═══════╣
║ 1 ║ 4 ║ 2017 ║ 5 ║
║ 1 ║ 1 ║ 2018 ║ 7 ║
║ 2 ║ 1 ║ 2018 ║ 8 ║
╚════╩═════════╩══════╩═══════╝
我想找到最后一个id,并将四分之一增加到4,同时保持相同的值。预期的输出是:
╔════╦═════════╦══════╦═══════╗
║ id ║ quarter ║ year ║ value ║
╠════╬═════════╬══════╬═══════╣
║ 1 ║ 4 ║ 2017 ║ 5 ║
║ 1 ║ 1 ║ 2018 ║ 7 ║
║ 1 ║ 2 ║ 2018 ║ 7 ║
║ 1 ║ 3 ║ 2018 ║ 7 ║
║ 1 ║ 4 ║ 2018 ║ 7 ║
║ 2 ║ 1 ║ 2018 ║ 8 ║
║ 2 ║ 2 ║ 2018 ║ 8 ║
║ 2 ║ 3 ║ 2018 ║ 8 ║
║ 2 ║ 4 ║ 2018 ║ 8 ║
╚════╩═════════╩══════╩═══════╝
我尝试在熊猫中使用df.last()来找到id的最后一个实例,并通过循环增加四分之一,但这似乎不起作用。我是python和pandas的新手,所以任何建议都很棒。
答案 0 :(得分:2)
首先,您可以使用sapply
来获取每个ID的最后一个值
drop_duplicate
答案 1 :(得分:1)
首先,获取每个组中的最后一行:
s = df.groupby('id').tail(1)
然后扩展到四个季度:
out = pd.concat([s]*4).sort_values('id').assign(quarter=np.tile([1,2,3,4], len(s)))
最后,合并:
df.merge(out, how='outer').sort_values('id')
id quarter year value
0 1 4 2017 5
1 1 1 2018 7
3 1 2 2018 7
4 1 3 2018 7
5 1 4 2018 7
2 2 1 2018 8
6 2 2 2018 8
7 2 3 2018 8
8 2 4 2018 8