如何让pandas pct_change独立地影响具有给定索引值的行?

7jmck4yq  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

我有一个这样的框架:

df = pd.DataFrame([
    ['A', 2],
    ['B', 4],
    ['C', 20],
    ['B', 8],
    ['C', 2],
    ['A', 2]],
    columns=['Label', 'Val1',])

print(df)

  Label  Val1
0     A     2
1     B     4
2     C    20
3     B     8
4     C     2
5     A     2

字符串
如果我计算Val1的百分比变化:

df['Val1_change'] = df['Val1'].pct_change(periods=1)


我得到了这个:

Label  Val1  Val1_change
0     A     2          NaN
1     B     4         1.00
2     C    20         4.00
3     B     8        -0.60
4     C     2        -0.75
5     A     2         0.00


每一行都根据它的值相对于前一个值的变化。酷。
然而,我想计算具有相同Label值的行之间的百分比变化,因此具有Label A的行中的每个值都是根据与具有值A的前一行的变化来计算的,依此类推。
所以我会得到这个:

Label  Val1  Val1_change
0     A     2         NaN
1     B     4         NaN
2     C    20         NaN
3     B     8         1.00    # 100% increase from previous B row
4     C     2        -0.90    # 90 decrease from previous C row
5     A     2         0.00    # no change from previous A row


我尝试先将Label设置为索引:

df.set_index('Label', inplace=True)
df['Val1_change'] = df['Val1'].pct_change(periods=1)


但计算的pct_change没有变化:

Label                   
A         2          NaN
B         4         1.00
C        20         4.00
B         8        -0.60
C         2        -0.75
A         2         0.00


如何在pandas中实现这一点?

shyt4zoc

shyt4zoc1#

Label分组并在Val1列上执行.pct_change()

df["Val1_change"] = df.groupby("Label")["Val1"].pct_change(periods=1)
print(df)

字符串
打印:

Label  Val1  Val1_change
0     A     2          NaN
1     B     4          NaN
2     C    20          NaN
3     B     8          1.0
4     C     2         -0.9
5     A     2          0.0

相关问题