Сводная таблица Pandas - показывает значения под тем же индексом столбца - PullRequest
1 голос
/ 16 мая 2019

У меня проблемы с созданием сводной таблицы Pandas. Я хочу иметь два значения ['Balance', 'WAP'] в одном столбце ['Delivery'].

Вот DataFrame, построенный из словаря:

dict_data = {
    'Contract' : ['Contract 1', 'Contract 2', 'Contract 3', 'Contract 4'],
    'Contract_Date': ['01/01/2019', '02/02/2019', '03/03/2019', '04/03/2019'],
    'Delivery' : ['2019-01', '2019-01', '2019-02', '2019-03'],
    'Price' : [90, 95, 100, 105],
    'Balance': [50, 100, 150, 200]
}

df = pd.DataFrame.from_dict(dict_data)

df

Фрейм данных:

    Contract    Contract_Date   Delivery    Price   Balance
0   Contract 1  01/01/2019       2019-01    90      50
1   Contract 2  02/02/2019       2019-01    95      100
2   Contract 3  03/03/2019       2019-02    100     150
3   Contract 4  04/03/2019       2019-03    105     200

Рассчитать средневзвешенную цену:

# Create WAP - Weighted Average Price
df['Value'] = df['Balance'] * df['Price'] 
df['WAP'] = df['Value'] / df['Balance']
df

Конструкция сводного стола:

# Use a dictionary to apply more than 1 type of aggregate onto the data
f = {'Balance': ['sum'], 'WAP': ['mean']}

df.pivot_table(
    columns='Delivery',
    values=['Balance', 'WAP'],
    index=['Contract_Date', 'Contract'],
    aggfunc=f
).replace(np.nan, '')

pivot Я пытаюсь заставить 2 значения отображаться в одном столбце для более простого сравнения, как в приведенной ниже таблице (построенной вручную):

              Delivery   2019-01          2019-02          2019-03 
Contract Date Contract   Balance     WAP  Balance   WAP    Balance     WAP 
01/01/2019    Contract 1 50          90      
02/02/2019    Contract 2 100         95     
03/03/2019    Contract 3                  150       100
04/03/2019    Contract 4                                   200         105

Думаете ли вы где-нибудь на уровне стека / разборки для этой проблемы? Буду очень признателен за любую помощь, так как я все еще новичок в Пандах.

1 Ответ

1 голос
/ 16 мая 2019

Сначала преобразуйте списки элементов из словаря 1 в строки, чтобы избежать 3-го уровня MultiIndex:

f = {'Balance': 'sum', 'WAP': 'mean'}

А затем используйте DataFrame.swaplevel с DataFrame.sort_index:

f = {'Balance': 'sum', 'WAP': 'mean'}

df = (df.pivot_table(
    columns='Delivery',
    values=['Balance', 'WAP'],
    index=['Contract_Date', 'Contract'],
    aggfunc=f
     ).replace(np.nan, '')
       .swaplevel(1,0, axis=1)
       .sort_index(axis=1))
print (df)
Delivery                 2019-01     2019-02      2019-03     
                         Balance WAP Balance  WAP Balance  WAP
Contract_Date Contract                                        
01/01/2019    Contract 1      50  90                          
02/02/2019    Contract 2     100  95                          
03/03/2019    Contract 3                 150  100             
04/03/2019    Contract 4                              200  105
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...