[英]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.