Skip to content

Commit 86a9304

Browse files
committed
BUG: handle empty list passed to DataFrame.from_records
1 parent 93a1398 commit 86a9304

File tree

7 files changed

+59
-8
lines changed

7 files changed

+59
-8
lines changed

RELEASE.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pandas 0.6.2
6565
array (GH #490)
6666
- Return empty string from Series.to_string when called on empty Series (GH
6767
#488)
68+
- Fix exception passing empty list to DataFrame.from_records
6869

6970
Thanks
7071
------

pandas/core/frame.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3559,11 +3559,15 @@ def _rec_to_dict(arr):
35593559
return columns, sdict
35603560

35613561
def _list_to_sdict(data, columns):
3562-
if isinstance(data[0], tuple):
3562+
if len(data) > 0 and isinstance(data[0], tuple):
35633563
content = list(lib.to_object_array_tuples(data).T)
3564-
else:
3564+
elif len(data) > 0:
35653565
# list of lists
35663566
content = list(lib.to_object_array(data).T)
3567+
else:
3568+
if columns is None:
3569+
columns = []
3570+
return {}, columns
35673571

35683572
if columns is None:
35693573
columns = range(len(content))

pandas/src/tseries.pyx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ from cpython cimport (PyDict_New, PyDict_GetItem, PyDict_SetItem,
99
PyTuple_SetItem,
1010
PyTuple_New)
1111
from cpython cimport PyFloat_Check
12+
cimport cpython
1213

1314
import numpy as np
1415
isnan = np.isnan
@@ -448,6 +449,23 @@ cpdef is_array(object o):
448449
return np.PyArray_Check(o)
449450

450451

452+
# cdef class TypeConverter:
453+
# cdef:
454+
# cpython.PyTypeObject* klass_type
455+
456+
# cdef readonly:
457+
# object factory
458+
# object klass
459+
460+
# def __init__(self, object klass, factory):
461+
# self.klass_type = (<PyObject*> klass).ob_type
462+
# self.factory = factory
463+
464+
# def convert(self, object obj):
465+
# if cpython.PyObject_TypeCheck(obj, self.klass_type):
466+
# return obj
467+
# return self.factory(obj)
468+
451469
include "skiplist.pyx"
452470
include "groupby.pyx"
453471
include "moments.pyx"

pandas/tests/test_frame.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,6 +1428,15 @@ def test_from_records_tuples(self):
14281428
result = DataFrame.from_records(tuples)
14291429
self.assert_(np.array_equal(result.columns, range(4)))
14301430

1431+
# empty case
1432+
result = DataFrame.from_records([], columns=['foo', 'bar', 'baz'])
1433+
self.assertEqual(len(result), 0)
1434+
self.assert_(np.array_equal(result.columns, ['foo', 'bar', 'baz']))
1435+
1436+
result = DataFrame.from_records([])
1437+
self.assertEqual(len(result), 0)
1438+
self.assertEqual(len(result.columns), 0)
1439+
14311440
def test_get_agg_axis(self):
14321441
cols = self.frame._get_agg_axis(0)
14331442
self.assert_(cols is self.frame.columns)

vb_suite/reindex.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"""
1414
statement = "df.reindex(columns=df.columns[1:5])"
1515

16-
bm_reindex1 = Benchmark(statement, setup,
17-
name='dataframe_reindex_columns')
16+
reindex_frame_columns = Benchmark(statement, setup,
17+
name='dataframe_reindex_columns')
1818

1919
#----------------------------------------------------------------------
2020

@@ -26,5 +26,24 @@
2626
rng2 = Index(rng[::2])
2727
"""
2828
statement = "df.reindex(rng2)"
29-
bm_reindex2 = Benchmark(statement, setup,
30-
name='dataframe_reindex_daterange')
29+
reindex_frame_daterange = Benchmark(statement, setup,
30+
name='dataframe_reindex_daterange')
31+
32+
#----------------------------------------------------------------------
33+
# multiindex reindexing
34+
35+
setup = common_setup + """
36+
N = 1000
37+
K = 20
38+
39+
level1 = np.array([tm.rands(10) for _ in xrange(N)], dtype='O').repeat(K)
40+
level2 = np.tile(np.array([tm.rands(10) for _ in xrange(K)], dtype='O'),
41+
N)
42+
index = MultiIndex.from_arrays([level1, level2])
43+
44+
s1 = Series(np.random.randn(N * K), index=index)
45+
s2 = s1[::2]
46+
"""
47+
statement = "s1.reindex(s2.index)"
48+
reindex_multi = Benchmark(statement, setup,
49+
name='reindex_multiindex')

vb_suite/run_suite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from datetime import datetime
33

44
modules = ['groupby', 'indexing', 'reindex', 'binary_ops',
5-
'sparse']
5+
'sparse', 'index_object']
66

77
all_benchmarks = []
88
for modname in modules:

vb_suite/sparse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@
2525
"""
2626
stmt = "SparseDataFrame(series)"
2727

28-
bm_sparse1 = Benchmark(stmt, setup, name="SparseSeries to SparseDataFrame",
28+
bm_sparse1 = Benchmark(stmt, setup, name="sparse_series_to_frame",
2929
start_date=datetime(2011, 6, 1))

0 commit comments

Comments
 (0)