Мой DataFrame:
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)
Есть ли лучший/более эффективный способ?
Один метод, который я нашел действительно полезным, — это использование метода apply
вместе с lambda
. Он проверяет индекс и работает соответственно. Вы также можете без проблем сделать это через DataFrame.
import pandas as pd
df = pd.DataFrame({
'a': [20, 30, 2, 5, 10]
})
# Define a function to calculate the percentage change
def percent_change(row):
# Check if it's the first row
if row.name == 0:
# Compare with 40 for the first value
return ((row - 40) / 40) * 100
else:
# For subsequent rows, use the standard pct_change() method
return row.pct_change() * 100
# Apply the function to the 'a' column
df['pct_change'] = df['a'].apply(percent_change)
print(df)
Обратите также внимание на if row.name == 0:
, который определяет его, чтобы сравнить его с первым значением.
Вы можете использовать аргумент ключевого слова fill_value
в pct_change
.
В документации pct_change говорится:
Дополнительные аргументы ключевого слова передаются в
DataFrame.shift
илиSeries.shift
.
и Series.shift принимает аргумент fill_value
для заполнения недостающих строк.
import pandas as pd
df = pd.DataFrame({"a": [20, 30, 2, 5, 10]})
df["pct_change"] = df["a"].pct_change(fill_value=40).mul(100)
print(df)
Выход:
a pct_change
0 20 -50.000000
1 30 50.000000
2 2 -93.333333
3 5 150.000000
4 10 100.000000