From 12d39c6b1dac33006336e2b8855048ef82edf420 Mon Sep 17 00:00:00 2001 From: TomAugspurger Date: Mon, 12 Jan 2015 19:57:16 -0600 Subject: [PATCH] BUG: fix DataFrame constructor w named Series Pushing for now [ci skip] --- doc/source/whatsnew/v0.16.0.txt | 11 +++++++++++ pandas/core/frame.py | 11 +++++------ pandas/tests/test_frame.py | 12 ++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/doc/source/whatsnew/v0.16.0.txt b/doc/source/whatsnew/v0.16.0.txt index fcf18e6c1cf94..6a8add9e375be 100644 --- a/doc/source/whatsnew/v0.16.0.txt +++ b/doc/source/whatsnew/v0.16.0.txt @@ -367,6 +367,13 @@ The behavior of a small sub-set of edge cases for using ``.loc`` have changed (: In [4]: df.loc[2:3] TypeError: Cannot do slice indexing on with keys +DataFrame Construction Changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. _whatsnew_0160.api_breaking.construction: + + + .. _whatsnew_0160.deprecations: @@ -535,3 +542,7 @@ Bug Fixes - Fixed bug with reading CSV files from Amazon S3 on python 3 raising a TypeError (:issue:`9452`) - Bug in the Google BigQuery reader where the 'jobComplete' key may be present but False in the query results (:issue:`8728`) + + +- Fixed bug with DataFrame constructor when passed a Series with a +name and the `columns` keyword argument. diff --git a/pandas/core/frame.py b/pandas/core/frame.py index fad271dbdb224..5ed03582940a3 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -231,7 +231,7 @@ def __init__(self, data=None, index=None, columns=None, dtype=None, if columns is None: columns = data_columns mgr = self._init_dict(data, index, columns, dtype=dtype) - elif getattr(data, 'name', None): + elif getattr(data, 'name', None) is not None: mgr = self._init_dict({data.name: data}, index, columns, dtype=dtype) else: @@ -295,16 +295,15 @@ def _init_dict(self, data, index, columns, dtype=None): if columns is not None: columns = _ensure_index(columns) - # prefilter if columns passed - - data = dict((k, v) for k, v in compat.iteritems(data) - if k in columns) - if index is None: index = extract_index(list(data.values())) else: index = _ensure_index(index) + # prefilter if columns passed + data = dict((k, v) for k, v in compat.iteritems(data) + if k in columns) + arrays = [] data_names = [] for k in columns: diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index e1687fd6a67cf..f4580f37d2ee1 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -3362,6 +3362,18 @@ def test_constructor_Series_named(self): expected = DataFrame({ 1 : s1, 0 : arr },columns=[0,1]) assert_frame_equal(df,expected) + def test_constructor_Series_named_different(self): + # 9232 + x = Series([1, 2], name=0) + expected = DataFrame([np.nan, np.nan], columns=[1]) + result = DataFrame(x, columns=[1]) + assert_frame_equal(result, expected) + + x.name = 1 + expected = DataFrame([np.nan, np.nan], columns=[0]) + result = DataFrame(x, columns=[0]) + assert_frame_equal(result, expected) + def test_constructor_Series_differently_indexed(self): # name s1 = Series([1, 2, 3], index=['a', 'b', 'c'], name='x')