Unable to apply color gradient - Index Error

90 Views Asked by At

I was practicing crosstabulation of two fields and format it using color gradient. But I am getting an error called Index error while using the color gradient . Any kind of help would be appreciated :)

I have already created a cross tab , and I am trying to apply color gradient , but it is throwing me an index error. Below is the code I have tried:

pd.crosstab(data['EducationField'],data['Department'])

The above code has run successfully and after then I tried the following code:

pd.crosstab(data['EducationField'],data['Department']).style.bar(color=['gold'])

I get the following error for this :

IndexError                                Traceback (most recent call last)
File D:\COMMON SOFTWARE\lib\site-packages\IPython\core\formatters.py:342, in BaseFormatter.__call__(self, obj)
    340     method = get_real_method(obj, self.print_method)
    341     if method is not None:
--> 342         return method()
    343     return None
    344 else:

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style.py:385, in Styler._repr_html_(self)
    380 """
    381 Hooks into Jupyter notebook rich display system, which calls _repr_html_ by
    382 default if an object is returned at the end of a cell.
    383 """
    384 if get_option("styler.render.repr") == "html":
--> 385     return self.to_html()
    386 return None

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style.py:1377, in Styler.to_html(self, buf, table_uuid, table_attributes, sparse_index, sparse_columns, bold_headers, caption, max_rows, max_columns, encoding, doctype_html, exclude_styles, **kwargs)
   1374     obj.set_caption(caption)
   1376 # Build HTML string..
-> 1377 html = obj._render_html(
   1378     sparse_index=sparse_index,
   1379     sparse_columns=sparse_columns,
   1380     max_rows=max_rows,
   1381     max_cols=max_columns,
   1382     exclude_styles=exclude_styles,
   1383     encoding=encoding or get_option("styler.render.encoding"),
   1384     doctype_html=doctype_html,
   1385     **kwargs,
   1386 )
   1388 return save_to_buffer(
   1389     html, buf=buf, encoding=(encoding if buf is not None else None)
   1390 )

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style_render.py:206, in StylerRenderer._render_html(self, sparse_index, sparse_columns, max_rows, max_cols, **kwargs)
    194 def _render_html(
    195     self,
    196     sparse_index: bool,
   (...)
    200     **kwargs,
    201 ) -> str:
    202     """
    203     Renders the ``Styler`` including all applied styles to HTML.
    204     Generates a dict with necessary kwargs passed to jinja2 template.
    205     """
--> 206     d = self._render(sparse_index, sparse_columns, max_rows, max_cols, " ")
    207     d.update(kwargs)
    208     return self.template_html.render(
    209         **d,
    210         html_table_tpl=self.template_html_table,
    211         html_style_tpl=self.template_html_style,
    212     )

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style_render.py:163, in StylerRenderer._render(self, sparse_index, sparse_columns, max_rows, max_cols, blank)
    149 def _render(
    150     self,
    151     sparse_index: bool,
   (...)
    155     blank: str = "",
    156 ):
    157     """
    158     Computes and applies styles and then generates the general render dicts.
    159 
    160     Also extends the `ctx` and `ctx_index` attributes with those of concatenated
    161     stylers for use within `_translate_latex`
    162     """
--> 163     self._compute()
    164     dxs = []
    165     ctx_len = len(self.index)

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style_render.py:258, in StylerRenderer._compute(self)
    256 r = self
    257 for func, args, kwargs in self._todo:
--> 258     r = func(self)(*args, **kwargs)
    259 return r

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style.py:1736, in Styler._apply(self, func, axis, subset, **kwargs)
   1734 axis = self.data._get_axis_number(axis)
   1735 if axis == 0:
-> 1736     result = data.apply(func, axis=0, **kwargs)
   1737 else:
   1738     result = data.T.apply(func, axis=0, **kwargs).T  # see GH 42005

File D:\COMMON SOFTWARE\lib\site-packages\pandas\core\frame.py:9568, in DataFrame.apply(self, func, axis, raw, result_type, args, **kwargs)
   9557 from pandas.core.apply import frame_apply
   9559 op = frame_apply(
   9560     self,
   9561     func=func,
   (...)
   9566     kwargs=kwargs,
   9567 )
-> 9568 return op.apply().__finalize__(self, method="apply")

File D:\COMMON SOFTWARE\lib\site-packages\pandas\core\apply.py:764, in FrameApply.apply(self)
    761 elif self.raw:
    762     return self.apply_raw()
--> 764 return self.apply_standard()

File D:\COMMON SOFTWARE\lib\site-packages\pandas\core\apply.py:891, in FrameApply.apply_standard(self)
    890 def apply_standard(self):
--> 891     results, res_index = self.apply_series_generator()
    893     # wrap results
    894     return self.wrap_results(results, res_index)

File D:\COMMON SOFTWARE\lib\site-packages\pandas\core\apply.py:907, in FrameApply.apply_series_generator(self)
    904 with option_context("mode.chained_assignment", None):
    905     for i, v in enumerate(series_gen):
    906         # ignore SettingWithCopy here in case the user mutates
--> 907         results[i] = self.f(v)
    908         if isinstance(results[i], ABCSeries):
    909             # If we have a view on v, we need to make a copy because
    910             #  series_generator will swap out the underlying data
    911             results[i] = results[i].copy(deep=False)

File D:\COMMON SOFTWARE\lib\site-packages\pandas\core\apply.py:142, in Apply.__init__.<locals>.f(x)
    141 def f(x):
--> 142     return func(x, *args, **kwargs)

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style.py:4237, in _bar(data, align, colors, cmap, width, height, vmin, vmax, base_css)
   4235 assert isinstance(align, str)  # mypy: should now be in [left, right, mid, zero]
   4236 if data.ndim == 1:
-> 4237     return [
   4238         css_calc(
   4239             x - z, left - z, right - z, align, colors if rgbas is None else rgbas[i]
   4240         )
   4241         for i, x in enumerate(values)
   4242     ]
   4243 else:
   4244     return np.array(
   4245         [
   4246             [
   (...)
   4257         ]
   4258     )

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style.py:4238, in <listcomp>(.0)
   4235 assert isinstance(align, str)  # mypy: should now be in [left, right, mid, zero]
   4236 if data.ndim == 1:
   4237     return [
-> 4238         css_calc(
   4239             x - z, left - z, right - z, align, colors if rgbas is None else rgbas[i]
   4240         )
   4241         for i, x in enumerate(values)
   4242     ]
   4243 else:
   4244     return np.array(
   4245         [
   4246             [
   (...)
   4257         ]
   4258     )

File D:\COMMON SOFTWARE\lib\site-packages\pandas\io\formats\style.py:4154, in _bar.<locals>.css_calc(x, left, right, align, color)
   4151     return base_css
   4153 if isinstance(color, (list, tuple)):
-> 4154     color = color[0] if x < 0 else color[1]
   4155 assert isinstance(color, str)  # mypy redefinition
   4157 x = left if x < left else x

IndexError: list index out of range

<pandas.io.formats.style.Styler at 0x1c63635ffd0>

1

There are 1 best solutions below

0
Attack68 On

This is quite a simple fix. The documentation says color is a str or a 2-tuple/list. You have supplied a 1-tuple/list, hence the error. Change to color="gold", from color=["gold"]