Estou criando um relatório em PDF usando o Report Lab com base em vários dataframes do Pandas.
As tabelas exibidas no PDF precisam ter duas colunas em uma ordem específica.
aqui está um exemplo de dataframe:
df = pd.DataFrame({
'Counterparty': ['foo', 'fizz', 'fizz', 'fizz','fizz', 'foo'],
'Commodity': ['bar', 'bar', 'bar', 'bar','bar', 'ab cred'],
'DealType': ['Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Buy'],
'StartDate': ['07/01/2024', '09/01/2024', '10/01/2024', '11/01/2024', '12/01/2024', '01/01/2025'],
'FloatPrice': [18.73, 17.12, 17.76, 18.72, 19.47, 20.26],
'MTMValue':[10, 10, 10, 10, 10, 10]
})
out = pd.pivot_table(df, values = 'MTMValue', index='Counterparty', columns = 'Commodity', aggfunc='sum').reset_index().rename_axis(None, axis=1).fillna(0)
out['Cumulative Exposure'] = out[out.columns[1:]].sum(axis = 1)
Counterparty ab cred bar Cumulative Exposure
0 fizz 0.0 40.0 40.0
1 foo 10.0 10.0 20.0
Eu preciso disto:
Counterparty bar ab cred Cumulative Exposure
0 fizz 40.0 0.0 40.0
1 foo 10.0 10.0 20.0
onde ab cred
sempre estará antes cumulative exposure
e depois do último commodity
, já que pode haver x
quantidade de commodities adicionadas aos dados ( ab cred
é sempre incluído como uma commodity). Mais colunas também podem ser adicionadas depois cumulative exposure
a qualquer momento.
Uma opção fácil seria
pop
reinserirab cred
para que fique por último:Outra opção seria
sort_index
usar uma chave personalizada:E, claro, se você souber a ordem explícita desejada, você sempre poderá reindexar (e também observar que você pode evitar a
fillna
atribuição posterior daCumulative Exposure
coluna):Saída:
Você também pode tentar usar
groupby
,sum
, eunstack
para produzir o mesmo efeito que a tabela dinâmica. Não tenho certeza de qual é mais rápido. Para definir uma ordem específica, você pode especificar as colunas na ordem desejada.Aqui vai uma breve frase:
Fora: