Этого можно легко достичь с помощью функций группировки.
К сожалению, первые и последние значения трех стран в вашем наборе данных одинаковы, поэтому результат также в три раза больше двух одинаковых значений.
(Возможно, что-то не так с выборочными данными?)
Сначала сгруппируйте фрейм данных по странам и выберите только два интересующих столбца:
grpd = df.groupby('countries')['gini', 'ECONOMIC FREEDOM']
С этим Groupby-Object
вы можете применять функции к подмножествам ваших данных, которые разделены функцией группировки, countries
в вашем случае.
Например, чтобы получить последнее значение в каждой группе, просто запросите
grpd.last()
gini ECONOMIC FREEDOM
countries
Argentina 50.7 6.16
Bolivia 50.7 6.16
Chile 50.7 6.16
или, соответственно, для первой строки в каждой группе
grpd.first()
gini ECONOMIC FREEDOM
countries
Argentina 40.8 4.25
Bolivia 40.8 4.25
Chile 40.8 4.25
для расчета процента изменения последнего относительно первого, поэтому вы могли бы просто написать
(grpd.last() - grpd.first()) / grpd.first()
gini ECONOMIC FREEDOM
countries
Argentina 0.242647 0.449411
Bolivia 0.242647 0.449411
Chile 0.242647 0.449411
РЕДАКТИРОВАТЬ:
вывод также может быть отформатирован, например:
df_change = (grpd.last() - grpd.first()) / grpd.first()
df_change.applymap(lambda x: str.format('{:+.1f%}', x))
gini ECONOMIC FREEDOM
countries
Argentina +24.3% +44.9%
Bolivia +24.3% +44.9%
Chile +24.3% +44.9%
EDIT2:
только для знаков:
df_change.applymap(lambda x: ['-', ' ', '+'][np.sign(x).astype(int)+1])
gini ECONOMIC FREEDOM
countries
Argentina + +
Bolivia + +
Chile + +