Skip to content

Commit dd439c9

Browse files
committed
BUG: DataFrame.from_records bug with index column and empty record list. close #2633
1 parent 03bee8d commit dd439c9

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

RELEASE.rst

+3
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ pandas 0.10.1
8282
results (GH2599_)
8383
- Fix groupby summing performance issue on boolean data (GH2692_)
8484
- Don't bork Series containing datetime64 values with to_datetime (GH2699_)
85+
- Fix DataFrame.from_records corner case when passed columns, index column,
86+
but empty record list (GH2633_)
8587

8688
**API Changes**
8789

@@ -101,6 +103,7 @@ pandas 0.10.1
101103
.. _GH2616: https://github.com/pydata/pandas/issues/2616
102104
.. _GH2625: https://github.com/pydata/pandas/issues/2625
103105
.. _GH2643: https://github.com/pydata/pandas/issues/2643
106+
.. _GH2633: https://github.com/pydata/pandas/issues/2633
104107
.. _GH2637: https://github.com/pydata/pandas/issues/2637
105108
.. _GH2690: https://github.com/pydata/pandas/issues/2690
106109
.. _GH2692: https://github.com/pydata/pandas/issues/2692

pandas/core/frame.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -1030,7 +1030,10 @@ def from_records(cls, data, index=None, exclude=None, columns=None,
10301030
not hasattr(index, "__iter__")):
10311031
i = columns.get_loc(index)
10321032
exclude.add(index)
1033-
result_index = Index(arrays[i], name=index)
1033+
if len(arrays) > 0:
1034+
result_index = Index(arrays[i], name=index)
1035+
else:
1036+
result_index = Index([], name=index)
10341037
else:
10351038
try:
10361039
to_remove = [arr_columns.get_loc(field) for field in index]
@@ -1043,9 +1046,11 @@ def from_records(cls, data, index=None, exclude=None, columns=None,
10431046
result_index = index
10441047

10451048
if any(exclude):
1046-
to_remove = [arr_columns.get_loc(col) for col in exclude]
1049+
arr_exclude = [x for x in exclude if x in arr_columns]
1050+
to_remove = [arr_columns.get_loc(col) for col in arr_exclude]
10471051
arrays = [v for i, v in enumerate(arrays) if i not in to_remove]
1048-
arr_columns = arr_columns.drop(exclude)
1052+
1053+
arr_columns = arr_columns.drop(arr_exclude)
10491054
columns = columns.drop(exclude)
10501055

10511056
mgr = _arrays_to_mgr(arrays, arr_columns, result_index,

pandas/tests/test_frame.py

+9
Original file line numberDiff line numberDiff line change
@@ -2928,6 +2928,15 @@ def __iter__(self):
29282928
expected = DataFrame.from_records(tups)
29292929
assert_frame_equal(result, expected)
29302930

2931+
def test_from_records_len0_with_columns(self):
2932+
# #2633
2933+
result = DataFrame.from_records([], index='foo',
2934+
columns=['foo', 'bar'])
2935+
2936+
self.assertTrue(np.array_equal(result.columns, ['bar']))
2937+
self.assertEqual(len(result), 0)
2938+
self.assertEqual(result.index.name, 'foo')
2939+
29312940
def test_get_agg_axis(self):
29322941
cols = self.frame._get_agg_axis(0)
29332942
self.assert_(cols is self.frame.columns)

0 commit comments

Comments
 (0)