diff --git a/plotly/grid_objs/grid_objs.py b/plotly/grid_objs/grid_objs.py index 128d3bf90a1..d373d39d2e2 100644 --- a/plotly/grid_objs/grid_objs.py +++ b/plotly/grid_objs/grid_objs.py @@ -9,7 +9,9 @@ from requests.compat import json as _json -from plotly import exceptions, utils +from plotly import exceptions, optional_imports, utils + +pd = optional_imports.get_module('pandas') __all__ = None @@ -148,7 +150,20 @@ def __init__(self, columns_or_json, fid=None): ``` """ # TODO: verify that columns are actually columns - if isinstance(columns_or_json, dict): + if pd and isinstance(columns_or_json, pd.DataFrame): + duplicate_name = utils.get_first_duplicate(columns_or_json.columns) + if duplicate_name: + err = exceptions.NON_UNIQUE_COLUMN_MESSAGE.format(duplicate_name) + raise exceptions.InputError(err) + + # create columns from dataframe + all_columns = [] + for name in columns_or_json.columns: + all_columns.append(Column(columns_or_json[name].tolist(), name)) + self._columns = all_columns + self.id = '' + + elif isinstance(columns_or_json, dict): # check that fid is entered if fid is None: raise exceptions.PlotlyError( diff --git a/plotly/tests/test_optional/test_grid/__init__.py b/plotly/tests/test_optional/test_grid/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/plotly/tests/test_optional/test_grid/test_grid.py b/plotly/tests/test_optional/test_grid/test_grid.py new file mode 100644 index 00000000000..dcac3211a05 --- /dev/null +++ b/plotly/tests/test_optional/test_grid/test_grid.py @@ -0,0 +1,32 @@ +""" +test_grid: +========== + +A module intended for use with Nose. + +""" +from __future__ import absolute_import + +from unittest import TestCase + +from plotly.exceptions import InputError +from plotly.grid_objs import Grid + +import pandas as pd + + +class TestDataframeToGrid(TestCase): + + # Test duplicate columns + def test_duplicate_columns(self): + df = pd.DataFrame([[1, 'a'], [2, 'b']], + columns=['col_1', 'col_1']) + + expected_message = ( + "Yikes, plotly grids currently " + "can't have duplicate column names. Rename " + "the column \"{}\" and try again.".format('col_1') + ) + + with self.assertRaisesRegexp(InputError, expected_message): + Grid(df)