custom.html 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. {%- set style_index_value = style_index_value or '' -%}
  2. {%- set n_headers = df.index.names.__len__() + df.columns.__len__() -%}
  3. {%- set n_indexes = df.index.names|length -%}
  4. {%- set is_multi_index = df.index.nlevels > 1 -%}
  5. {%- set is_multi_columns = df.columns.nlevels > 1 -%}
  6. <table style="border-collapse: collapse; {{style_table}}">
  7. <thead style="{{ style_thead }}">
  8. {%- set column_tuples = df.columns.tolist() -%}
  9. {#- Fill first with empty values (placeholder for index names below) -#}
  10. {%- for n_level in range(df.columns.nlevels) -%}
  11. {%- set level = df.columns.get_level_values(n_level) %}
  12. <tr>
  13. {# Fill first with empty values (placeholder for index names below) #}
  14. {%- for _ in range(n_indexes-1) -%}
  15. <th></th>
  16. {% endfor -%}
  17. {#- Set the actual column values -#}
  18. <th style="{{ style_column_name }}">{% if level.name is not none %}{{ level.name }}{% endif %}</th>
  19. {% for header in level -%}
  20. {%- set span = get_span(column_tuples, loc=loop.index0, width=n_level if is_multi_columns else none) -%}
  21. {%- set is_last_group_column = is_last_group_row(loop.index0, df.columns, level=n_level) -%}
  22. {%- if span > 0 %}
  23. <th style="{{ style_column_value }}
  24. {{ style_column_value_last_column_group if is_last_group_column else ''}}" colspan="{{ span }}">{{ header }}</th>
  25. {%- endif -%}
  26. {% endfor %}
  27. </tr>
  28. {% endfor %}
  29. <tr>
  30. {# Last header row is the index names #}
  31. {%- for index_header in df.index.names -%}
  32. <th style="{{ style_index_name }}{{ style_index_name_last if loop.last else ''}}">{% if index_header is not none %}{{ index_header }}{% endif %}</th>
  33. {% endfor %}
  34. {#- Fill rest to empty values -#}
  35. {%- for _ in df.columns -%}
  36. {%- set is_last_group_column = is_last_group_row(loop.index0, df.columns) -%}
  37. <th style="{{ style_index_name }}
  38. {{ style_column_value_last_column_group if is_last_group_column else ''}}"></th>
  39. {% endfor %}
  40. </tr>
  41. </thead>
  42. <tbody style="{{ style_tbody }}">
  43. {%- set index_tuples = df.index.tolist() -%}
  44. {% for idx, row in df.iterrows() -%}
  45. {%- set idx = [idx] if df.index.nlevels == 1 else idx -%}
  46. {%- set row_loop = loop -%}
  47. <tr style="{{ loop.cycle(style_row_odd, style_row_even) }}">
  48. {% for value in idx -%}
  49. {%- set index_width = loop.index0 if is_multi_index else none -%}
  50. {%- set is_last_group_index = is_last_group_row(row_loop.index0, df.index, level=index_width) -%}
  51. {%- set span = get_span(index_tuples, loc=row_loop.index0, width=index_width) -%}
  52. {%- if span > 0 %}
  53. <th style="{{ style_index_value }}
  54. {{ style_index_value_last if loop.last else '' }}
  55. {{ row_loop.cycle(style_row_value_odd, style_row_value_even) }}
  56. {{ style_index_value_last_index_group if is_last_group_index else ''}}"
  57. rowspan="{{ span }}">{{ value }}</th>
  58. {%- endif -%}
  59. {% endfor %}
  60. {%- for value in row -%}
  61. {%- set is_last_group_index = is_last_group_row(row_loop.index0, df.index) -%}
  62. {%- set is_last_group_column = is_last_group_row(loop.index0, df.columns) -%}
  63. <td style="{{ style_value }}
  64. {{ row_loop.cycle(style_row_value_odd, style_row_value_even) }}
  65. {{ style_value_last_index_group if is_last_group_index else ''}}
  66. {{ style_value_last_column_group if is_last_group_column else ''}}">{{ value }}</td>
  67. {% endfor %}
  68. </tr>
  69. {% endfor %}
  70. </tbody>
  71. </table>