繁体   English   中英

如何计算 pandas 中零的百分比变化?

[英]How to calculate percentage change with zero in pandas?

我想计算以下数据框的百分比变化。

import pandas as pd

df = pd.DataFrame({'team': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
                   'points': [12, 0, 19, 22, 0, 25, 0, 30],
                   'score': [12, 0, 19, 22, 0, 25, 0, 30] 
                   
                   })
print(df)

当我应用此步骤时,它会返回 inf,这很明显,因为我们除以零。

df['score'] = df.groupby('team', sort=False)['score'].apply(
     lambda x: x.pct_change()).to_numpy()

但是如果我们在每一列中看到从 0 到 19 的变化是 100%,从 0 到 25 的变化是 100%,从 0 到 30 的变化是 100%。 所以,我想知道如何计算这些值。

当前结果在此处输入图像描述

预期结果是在此处输入图像描述

所以你只想用 1 替换无限值?

import numpy as np

df[['points', 'score']] = (
  df.groupby('team')
    .pct_change()
    .replace(np.inf, 1)
)

Output:

  team  points  score
0    A     NaN    NaN
1    A    -1.0   -1.0
2    A     1.0    1.0
3    B     NaN    NaN
4    B    -1.0   -1.0
5    B     1.0    1.0
6    C     NaN    NaN
7    C     1.0    1.0

不确定你是否想将分数的下降算作负数,但这会给你你正在寻找的计算结果(乘以 100 得到你如何表示输出中的百分比)。 基本上,diff 计算当前和先前之间的差异。

df = pd.DataFrame({'team': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
               'points': [12, 0, 19, 22, 0, 25, 0, 30],
               'score': [12, 0, 19, 22, 0, 25, 0, 30]

               })

df["score"] = df.groupby('team', sort=False)['score'].diff() * 100

print(df)

要将行设置为 1 / -1,只需将 loc 用于正值/负值并像这样进行相应设置

df.loc[df["score"] < 0, "score"] = -1
df.loc[df["score"] > 0, "score"] = 1
# take the sign using np.sign for the diff b/w two consecutive rows
df['chg']=np.sign(df.groupby('team')['score'].diff())
df
    team    points  score   chg
0     A        12      12   NaN
1     A         0       0   -1.0
2     A        19      19   1.0
3     B        22      22   NaN
4     B         0       0   -1.0
5     B        25      25   1.0
6     C         0       0   NaN
7     C        30      30   1.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM