假设我有一个如下所示的df:
x name
12 q
1 q
3 q
383 z
31 z
21 z
68 r
32 r
2 r
我需要计算每个名称的第一个值和最后一个值之间的百分比增长,所以结果应该像这样
x name
300% q
1723% z
20% r
我尝试按名称使用第一组,但是现在我无法前进了。您有任何解决办法的想法吗?
感谢所有人的帮助
答案 0 :(得分:1)
首先聚合first
和last
函数,然后使用pct_change
:
df = (df.groupby('name')['x']
.agg([('a','last'),('x','first')])
.pct_change(axis=1)['x']
.mul(100)
.reset_index())
print (df)
name x
0 q 300.000000
1 r 3300.000000
2 z 1723.809524
另一种解决方案:
a = df.drop_duplicates('name', keep='last').set_index('name')['x']
b = df.drop_duplicates('name').set_index('name')['x']
df = b.sub(a).div(a).mul(100).round(2).reset_index()
print (df)
name x
0 q 300.00
1 z 1723.81
2 r 3300.00