我的数据帧是:
import pandas as pd
df = pd.DataFrame(
{
'a': [20, 30, 2, 5, 10]
}
)
预期输出是
pct_change()
的
a
:
a pct_change
0 20 -50.000000
1 30 50.000000
2 2 -93.333333
3 5 150.000000
4 10 100.000000
我想将
df.a.iloc[0]
与40进行比较
pct_change
的第一个值。如果我使用
df['pct_change'] = df.a.pct_change().mul(100)
,第一个值是
NaN
我的尝试:
def percent(a, b):
result = ((a - b) / b) * 100
return result.round(2)
df.loc[df.index[0], 'pct_change'] = percent(df.a.iloc[0], 40)
我有更好/更有效的方法吗?
当然!以下是如何在
pct_change()
中处理第一个值的不同方法:
1. 设置自定义基准
无需单独计算第一个百分比变化,可以将第一个值与所需的基准(在本例中为 40)一起包含在 DataFrame 中,然后应用
pct_change()
:
import pandas as pd
df = pd.DataFrame({'a': [20, 30, 2, 5, 10]})
# 在开头插入基准值
df.loc[-1] = [40]
df = df.sort_index().reset_index(drop=True)
# 现在计算 pct_change()
df['pct_change'] = df['a'].pct_change().mul(100)
print(df)
输出:
a pct_change
0 40 NaN
1 20 -50.000000
2 30 50.000000
3 2 -93.333333
4 5 150.000000
5 10 100.000000
2. 使用
fillna()
替换 NaN
在计算
pct_change()
之后,可以使用的自定义函数计算的第一个值替换
NaN
值:
import pandas as pd
df = pd.DataFrame({'a': [20, 30, 2, 5, 10]})
df['pct_change'] = df['a'].pct_change().mul(100)
def percent(a, b):
result = ((a - b) / b) * 100
return result.round(2)
df['pct_change'] = df['pct_change'].fillna(percent(df['a'].iloc[0], 40))
print(df)
输出:
a pct_change
0 20 -50.00
1 30 50.00
2 2 -93.33
3 5 150.00
4 10 100.00
哪个方法更好?
- 方法 1(设置自定义基准): 如果始终需要相对于固定基准的百分比变化,则此方法更直接、更有效。
-
方法 2(使用
fillna()
): 如果需要在计算pct_change()
后灵活处理第一个值或对第一个值应用不同的逻辑,则此方法更灵活。
希望有帮助!如果有任何其他问题,请告诉我。
标签:python,pandas,dataframe From: 78851490