# Buggy code
def _translate(self):
    """
    Convert the DataFrame in `self.data` and the attrs from `_build_styles`
    into a dictionary of {head, body, uuid, cellstyle}
    """
    table_styles = self.table_styles or []
    caption = self.caption
    ctx = self.ctx
    precision = self.precision
    uuid = self.uuid or str(uuid1()).replace("-", "_")
    ROW_HEADING_CLASS = "row_heading"
    COL_HEADING_CLASS = "col_heading"
    DATA_CLASS = "data"
    BLANK_CLASS = "blank"
    BLANK_VALUE = ""

    cell_context = dict()

    n_rlvls = self.data.index.nlevels
    n_clvls = self.data.columns.nlevels
    rlabels = self.data.index.tolist()
    clabels = self.data.columns.tolist()

    idx_values = self.data.index.format(sparsify=False, adjoin=False, names=False)
    idx_values = lzip(*idx_values)

    if n_rlvls == 1:
        rlabels = [[x] for x in rlabels]
    if n_clvls == 1:
        clabels = [[x] for x in clabels]
    clabels = list(zip(*clabels))

    cellstyle = []
    head = []

    for r in range(n_clvls):
        row_es = [
            {"type": "th", "value": BLANK_VALUE, "class": " ".join([BLANK_CLASS])}
        ] * n_rlvls
        for c in range(len(clabels[0])):
            cs = [COL_HEADING_CLASS, "level%s" % r, "col%s" % c]
            cs.extend(cell_context.get("col_headings", {}).get(r, {}).get(c, []))
            row_es.append({"type": "th", "value": clabels[r][c], "class": " ".join(cs)})
        head.append(row_es)

    if self.data.index.names:
        index_header_row = []

        for c, name in enumerate(self.data.index.names):
            cs = [COL_HEADING_CLASS, "level%s" % (n_clvls + 1), "col%s" % c]
            index_header_row.append(
                {"type": "th", "value": name, "class": " ".join(cs)}
            )

        index_header_row.extend(
            [{"type": "th", "value": BLANK_VALUE, "class": " ".join([BLANK_CLASS])}]
            * len(clabels[0])
        )

        head.append(index_header_row)

    body = []
    for r, idx in enumerate(self.data.index):
        cs = [ROW_HEADING_CLASS, "level%s" % c, "row%s" % r]
        cs.extend(cell_context.get("row_headings", {}).get(r, {}).get(c, []))
        row_es = [
            {"type": "th", "value": rlabels[r][c], "class": " ".join(cs)}
            for c in range(len(rlabels[r]))
        ]

        for c, col in enumerate(self.data.columns):
            cs = [DATA_CLASS, "row%s" % r, "col%s" % c]
            cs.extend(cell_context.get("data", {}).get(r, {}).get(c, []))
            row_es.append(
                {
                    "type": "td",
                    "value": self.data.iloc[r][c],
                    "class": " ".join(cs),
                    "id": "_".join(cs[1:]),
                }
            )
            props = []
            for x in ctx[r, c]:
                # have to handle empty styles like ['']
                if x.count(":"):
                    props.append(x.split(":"))
                else:
                    props.append(["", ""])
            cellstyle.append({"props": props, "selector": "row%s_col%s" % (r, c)})
        body.append(row_es)

    return dict(
        head=head,
        cellstyle=cellstyle,
        body=body,
        uuid=uuid,
        precision=precision,
        table_styles=table_styles,
        caption=caption,
        table_attributes=self.table_attributes,
    )


# Traceback (KeyError)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.5/site-packages/IPython/core/formatters.py in __call__(self, obj)
339             method = _safe_get_formatter_method(obj, self.print_method)
340             if method is not None:
--> 341                 return method()
342             return None
343         else:

/usr/local/lib/python3.5/site-packages/pandas/core/style.py in _repr_html_(self)
158         Hooks into Jupyter notebook rich display system.
159         '''
--> 160         return self.render()
161
162     def _translate(self):

/usr/local/lib/python3.5/site-packages/pandas/core/style.py in render(self)
259         """
260         self._compute()
--> 261         d = self._translate()
262         # filter out empty styles, every cell will have a class
263         # but the list of props may just be [['', '']].

/usr/local/lib/python3.5/site-packages/pandas/core/style.py in _translate(self)
220                 cs = [DATA_CLASS, "row%s" % r, "col%s" % c]
221                 cs.extend(cell_context.get("data", {}).get(r, {}).get(c, []))
--> 222                 row_es.append({"type": "td", "value": self.data.iloc[r][c],
223                                "class": " ".join(cs), "id": "_".join(cs[1:])})
224                 props = []

/usr/local/lib/python3.5/site-packages/pandas/core/series.py in __getitem__(self, key)
555     def __getitem__(self, key):
556         try:
--> 557             result = self.index.get_value(self, key)
558
559             if not np.isscalar(result):

/usr/local/lib/python3.5/site-packages/pandas/core/index.py in get_value(self, series, key)
1788
1789         try:
-> 1790             return self._engine.get_value(s, k)
1791         except KeyError as e1:
1792             if len(self) > 0 and self.inferred_type in ['integer','boolean']:

pandas/index.pyx in pandas.index.IndexEngine.get_value (pandas/index.c:3204)()

pandas/index.pyx in pandas.index.IndexEngine.get_value (pandas/index.c:2903)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3843)()

pandas/hashtable.pyx in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:6525)()

pandas/hashtable.pyx in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:6463)()

KeyError: 0

# Fixed code
def _translate(self):
    """
    Convert the DataFrame in `self.data` and the attrs from `_build_styles`
    into a dictionary of {head, body, uuid, cellstyle}
    """
    table_styles = self.table_styles or []
    caption = self.caption
    ctx = self.ctx
    precision = self.precision
    uuid = self.uuid or str(uuid1()).replace("-", "_")
    ROW_HEADING_CLASS = "row_heading"
    COL_HEADING_CLASS = "col_heading"
    DATA_CLASS = "data"
    BLANK_CLASS = "blank"
    BLANK_VALUE = ""

    cell_context = dict()

    n_rlvls = self.data.index.nlevels
    n_clvls = self.data.columns.nlevels
    rlabels = self.data.index.tolist()
    clabels = self.data.columns.tolist()

    idx_values = self.data.index.format(sparsify=False, adjoin=False, names=False)
    idx_values = lzip(*idx_values)

    if n_rlvls == 1:
        rlabels = [[x] for x in rlabels]
    if n_clvls == 1:
        clabels = [[x] for x in clabels]
    clabels = list(zip(*clabels))

    cellstyle = []
    head = []

    for r in range(n_clvls):
        row_es = [
            {"type": "th", "value": BLANK_VALUE, "class": " ".join([BLANK_CLASS])}
        ] * n_rlvls
        for c in range(len(clabels[0])):
            cs = [COL_HEADING_CLASS, "level%s" % r, "col%s" % c]
            cs.extend(cell_context.get("col_headings", {}).get(r, {}).get(c, []))
            value = clabels[r][c]
            row_es.append(
                {
                    "type": "th",
                    "value": value,
                    "display_value": value,
                    "class": " ".join(cs),
                }
            )
        head.append(row_es)

    if self.data.index.names:
        index_header_row = []

        for c, name in enumerate(self.data.index.names):
            cs = [COL_HEADING_CLASS, "level%s" % (n_clvls + 1), "col%s" % c]
            index_header_row.append(
                {"type": "th", "value": name, "class": " ".join(cs)}
            )

        index_header_row.extend(
            [{"type": "th", "value": BLANK_VALUE, "class": " ".join([BLANK_CLASS])}]
            * len(clabels[0])
        )

        head.append(index_header_row)

    body = []
    for r, idx in enumerate(self.data.index):
        cs = [ROW_HEADING_CLASS, "level%s" % c, "row%s" % r]
        cs.extend(cell_context.get("row_headings", {}).get(r, {}).get(c, []))
        row_es = [
            {
                "type": "th",
                "value": rlabels[r][c],
                "class": " ".join(cs),
                "display_value": rlabels[r][c],
            }
            for c in range(len(rlabels[r]))
        ]

        for c, col in enumerate(self.data.columns):
            cs = [DATA_CLASS, "row%s" % r, "col%s" % c]
            cs.extend(cell_context.get("data", {}).get(r, {}).get(c, []))
            formatter = self._display_funcs[(r, c)]
            value = self.data.iloc[r, c]
            row_es.append(
                {
                    "type": "td",
                    "value": value,
                    "class": " ".join(cs),
                    "id": "_".join(cs[1:]),
                    "display_value": formatter(value),
                }
            )
            props = []
            for x in ctx[r, c]:
                # have to handle empty styles like ['']
                if x.count(":"):
                    props.append(x.split(":"))
                else:
                    props.append(["", ""])
            cellstyle.append({"props": props, "selector": "row%s_col%s" % (r, c)})
        body.append(row_es)

    return dict(
        head=head,
        cellstyle=cellstyle,
        body=body,
        uuid=uuid,
        precision=precision,
        table_styles=table_styles,
        caption=caption,
        table_attributes=self.table_attributes,
    )