У меня есть следующий набор данных:

import pandas as pd
w = pd.Series(['EY', 'EY', 'EY', 'KPMG', 'KPMG', 'KPMG', 'BAIN', 'BAIN', 'BAIN'])
x = pd.Series([2020,2019,2018,2020,2019,2018,2020,2019,2018])
y = pd.Series([100000, 500000, 1000000, 50000, 100000, 40000, 1000, 500, 4000])
z = pd.Series([10000, 10000, 20000, 25000, 50000, 10000, 100000, 50500, 120000])
df = pd.DataFrame({'consultant': w, 'fiscal_year':x, 'actual_cost':y, 'budgeted_cost':z})

indexer_consultant_fy = ['consultant', 'fiscal_year']
df = df.set_index(indexer_consultant_fy).sort_index(ascending=True)
df['actual_budget_pct_diff'] = df.pct_change(axis='columns',fill_method='ffill')['budgeted_cost']

Как получить фактические и бюджетные затраты для переключения в последней строке кода без переключения столбцов в кадре данных?

В результате чего, когда фактическая_ценка выше, чем budgetted_cost , actual_budget_pct_diff будет положительным числом ? Спасибо всем!

1
BrianBeing 3 Июл 2019 в 07:58

3 ответа

Лучший ответ

Поскольку вам нужно просто вычислить pct_change между двумя столбцами, вы можете сделать это вручную , так как он все равно будет векторизован:

df['actual_budget_pct_diff'] = (df.actual_cost-df.budgeted_cost)/df.budgeted_cost

Вы получаете:

                        actual_cost  budgeted_cost  actual_budget_pct_diff
consultant fiscal_year                                                    
BAIN       2018                4000         120000               -0.966667
           2019                 500          50500               -0.990099
           2020                1000         100000               -0.990000
EY         2018             1000000          20000               49.000000
           2019              500000          10000               49.000000
           2020              100000          10000                9.000000
KPMG       2018               40000          10000                3.000000
           2019              100000          50000                1.000000
           2020               50000          25000                1.000000
2
Serge Ballesta 3 Июл 2019 в 06:06

Вы можете применить функцию df.pct_change к другому фрейму данных с переупорядоченными столбцами, не меняя столбцы самого df.

df['actual_budget_pct_diff'] = df[['budgeted_cost', 'actual_cost']].pct_change(axis='columns', fill_method='ffill')['actual_cost']

Обратите внимание, что df[['budgeted_cost', 'actual_cost']] - новый фрейм данных, который не влияет на порядок столбцов исходного фрейма данных df. Таким образом, порядок df все еще сохраняется как требуется:

                        actual_cost  budgeted_cost  actual_budget_pct_diff
consultant fiscal_year                                                    
BAIN       2018                4000         120000               -0.966667
           2019                 500          50500               -0.990099
           2020                1000         100000               -0.990000
EY         2018             1000000          20000               49.000000
           2019              500000          10000               49.000000
           2020              100000          10000                9.000000
KPMG       2018               40000          10000                3.000000
           2019              100000          50000                1.000000
           2020               50000          25000                1.000000
2
gehbiszumeis 3 Июл 2019 в 06:10

Просто укажите periods=-1 и выберите столбец [actual_cost] следующим образом:

df['actual_budget_pct_diff'] = df.pct_change(periods=-1, axis='columns',fill_method='ffill')['actual_cost']

Out[160]:
                        actual_cost  budgeted_cost  actual_budget_pct_diff
consultant fiscal_year
BAIN       2018                4000         120000               -0.966667
           2019                 500          50500               -0.990099
           2020                1000         100000               -0.990000
EY         2018             1000000          20000               49.000000
           2019              500000          10000               49.000000
           2020              100000          10000                9.000000
KPMG       2018               40000          10000                3.000000
           2019              100000          50000                1.000000
           2020               50000          25000                1.000000
3
Andy L. 3 Июл 2019 в 06:36