0

https://stackoverflow.com/a/17652442/2478647にあるパターンに従って、Reportlab の Pandas pivot_table からの出力をプロットしようとしています。

import pandas as pd
from reportlab.pdfgen import canvas
from reportlab.platypus import SimpleDocTemplate, Table, Paragraph
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter, legal, portrait, landscape
from reportlab.lib.styles import getSampleStyleSheet

df = pd.DataFrame(randn(8, 2), columns=['var A', 'var B'])
df['year'] = ['2013','2013','2013','2013','2014','2014','2014','2014']
df['run'] = ['base','base','option','option','base','base','option','option']
df['id'] = [1,2,1,2,1,2,1,2]

df.pivoted = pd.pivot_table(df, values=['var A','var B'], rows=['id'], cols=['year','run'], aggfunc='sum')

doc = SimpleDocTemplate('temp.pdf', pagesize=landscape(letter), showBoundary=0, 
                            topMargin=72*.75,
                            bottomMargin=72*1,
                            leftMargin=72*.5,
                            rightMargin=72*.5)

lista = [df.pivoted.columns[:,].values.astype(str).tolist()] + df.pivoted.values.tolist()

elements = []
table = Table(lista, repeatRows=3) # repeat the header rows
elements.append(table)    
doc.build(elements)

複数の列ラベルがあるため、「lista = ...」行でこのエラーが発生します。

ValueError: cannot set an array element with a sequence

pivot_table 列が reportlab でうまく機能するようにコードを構成するにはどうすればよいですか? または、pivot_table 出力を使用して PDF レポートを作成するための別のアプローチについて何か提案はありますか?

編集:私はこの変更にかなり近づいていますが、まだy軸ラベルを保持していません

lista = map(list, zip(*df.pivoted.columns.values)) + df.pivoted.values.tolist()
4

1 に答える 1

1

この関数は非常によく似ています。reportlab テーブルへの入力のリストと、繰り返すテーブル ヘッダー行の数を返します。何らかの理由で、ヘッダー行が 1 つしかない単純なテーブルではうまく機能しません。

def prepare_df_for_reportlab(df):
    df2 = df.reset_index() # reset the index so row labels show up in the reportlab table
    n = df2.columns.nlevels # number of table header rows to repeat
    if n > 1:
        labels = map(list, zip(*df2.columns.values))
    else:
        labels = [df2.columns[:,].values.astype(str).tolist()]
    values = df2.values.tolist()
    datalist = labels + values
    return datalist, n
于 2013-09-13T19:04:33.710 に答える