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