Skip to content

Commit ba5659d

Browse files
committed
DEPR: Deprecate from_items
1 parent 2a0e54b commit ba5659d

File tree

8 files changed

+111
-73
lines changed

8 files changed

+111
-73
lines changed

doc/source/whatsnew/v0.22.0.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Deprecations
8989

9090
- ``Series.from_array`` and ``SparseSeries.from_array`` are deprecated. Use the normal constructor ``Series(..)`` and ``SparseSeries(..)`` instead (:issue:`18213`).
9191
- ``DataFrame.as_matrix`` is deprecated. Use ``DataFrame.values`` instead (:issue:`18458`).
92-
-
92+
- :func:``DataFrame.from_items`` is deprecated. Use ``DataFrame(dict())`` instead (:issue:`17320`)
9393

9494
.. _whatsnew_0220.prior_deprecations:
9595

pandas/core/frame.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ def _constructor(self):
305305

306306
_constructor_sliced = Series
307307
_deprecations = NDFrame._deprecations | frozenset(
308-
['sortlevel', 'get_value', 'set_value', 'from_csv'])
308+
['sortlevel', 'get_value', 'set_value', 'from_csv', 'from_items'])
309309

310310
@property
311311
def _constructor_expanddim(self):
@@ -1234,6 +1234,9 @@ def to_records(self, index=True, convert_datetime64=True):
12341234
@classmethod
12351235
def from_items(cls, items, columns=None, orient='columns'):
12361236
"""
1237+
DEPRECATED: from_items is deprecated and will be removed in a
1238+
future version. Use :meth:`DataFrame(dict())` instead.
1239+
12371240
Convert (key, value) pairs to DataFrame. The keys will be the axis
12381241
index (usually the columns, but depends on the specified
12391242
orientation). The values should be arrays or Series.
@@ -1254,6 +1257,11 @@ def from_items(cls, items, columns=None, orient='columns'):
12541257
-------
12551258
frame : DataFrame
12561259
"""
1260+
1261+
warnings.warn("from_items is deprecated. Please use "
1262+
"DataFrame(dict()) instead.",
1263+
FutureWarning, stacklevel=2)
1264+
12571265
keys, values = lzip(*items)
12581266

12591267
if orient == 'columns':

pandas/io/stata.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,7 +1571,7 @@ def read(self, nrows=None, convert_dates=None,
15711571
else:
15721572
data_formatted.append((col, data[col]))
15731573
if requires_type_conversion:
1574-
data = DataFrame.from_items(data_formatted)
1574+
data = DataFrame(dict(data_formatted), columns=dict(data_formatted).keys())
15751575
del data_formatted
15761576

15771577
self._do_convert_missing(data, convert_missing)
@@ -1609,7 +1609,7 @@ def read(self, nrows=None, convert_dates=None,
16091609
convert = True
16101610
retyped_data.append((col, data[col].astype(dtype)))
16111611
if convert:
1612-
data = DataFrame.from_items(retyped_data)
1612+
data = DataFrame(dict(retyped_data), columns=dict(retyped_data).keys())
16131613

16141614
if index_col is not None:
16151615
data = data.set_index(data.pop(index_col))
@@ -1722,7 +1722,7 @@ def _do_convert_categoricals(self, data, value_label_dict, lbllist,
17221722
cat_converted_data.append((col, cat_data))
17231723
else:
17241724
cat_converted_data.append((col, data[col]))
1725-
data = DataFrame.from_items(cat_converted_data)
1725+
data = DataFrame(dict(cat_converted_data), columns=dict(cat_converted_data).keys())
17261726
return data
17271727

17281728
def data_label(self):
@@ -1997,7 +1997,7 @@ def _prepare_categoricals(self, data):
19971997
data_formatted.append((col, values))
19981998
else:
19991999
data_formatted.append((col, data[col]))
2000-
return DataFrame.from_items(data_formatted)
2000+
return DataFrame(dict(data_formatted), columns=dict(data_formatted).keys())
20012001

20022002
def _replace_nans(self, data):
20032003
# return data

pandas/tests/frame/test_constructors.py

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ def __len__(self, n):
859859
# GH 4297
860860
# support Array
861861
import array
862-
result = DataFrame.from_items([('A', array.array('i', range(10)))])
862+
result = DataFrame({'A': array.array('i', range(10))})
863863
expected = DataFrame({'A': list(range(10))})
864864
tm.assert_frame_equal(result, expected, check_dtype=False)
865865

@@ -1163,44 +1163,55 @@ def test_constructor_manager_resize(self):
11631163

11641164
def test_constructor_from_items(self):
11651165
items = [(c, self.frame[c]) for c in self.frame.columns]
1166-
recons = DataFrame.from_items(items)
1166+
with tm.assert_produces_warning(FutureWarning,
1167+
check_stacklevel=False):
1168+
recons = DataFrame.from_items(items)
11671169
tm.assert_frame_equal(recons, self.frame)
11681170

11691171
# pass some columns
1170-
recons = DataFrame.from_items(items, columns=['C', 'B', 'A'])
1172+
with tm.assert_produces_warning(FutureWarning,
1173+
check_stacklevel=False):
1174+
recons = DataFrame.from_items(items, columns=['C', 'B', 'A'])
11711175
tm.assert_frame_equal(recons, self.frame.loc[:, ['C', 'B', 'A']])
11721176

11731177
# orient='index'
11741178

11751179
row_items = [(idx, self.mixed_frame.xs(idx))
11761180
for idx in self.mixed_frame.index]
1177-
1178-
recons = DataFrame.from_items(row_items,
1179-
columns=self.mixed_frame.columns,
1180-
orient='index')
1181+
with tm.assert_produces_warning(FutureWarning,
1182+
check_stacklevel=False):
1183+
recons = DataFrame.from_items(row_items,
1184+
columns=self.mixed_frame.columns,
1185+
orient='index')
11811186
tm.assert_frame_equal(recons, self.mixed_frame)
11821187
assert recons['A'].dtype == np.float64
11831188

11841189
with tm.assert_raises_regex(TypeError,
11851190
"Must pass columns with "
11861191
"orient='index'"):
1187-
DataFrame.from_items(row_items, orient='index')
1192+
with tm.assert_produces_warning(FutureWarning,
1193+
check_stacklevel=False):
1194+
DataFrame.from_items(row_items, orient='index')
11881195

11891196
# orient='index', but thar be tuples
11901197
arr = lib.list_to_object_array(
11911198
[('bar', 'baz')] * len(self.mixed_frame))
11921199
self.mixed_frame['foo'] = arr
11931200
row_items = [(idx, list(self.mixed_frame.xs(idx)))
11941201
for idx in self.mixed_frame.index]
1195-
recons = DataFrame.from_items(row_items,
1196-
columns=self.mixed_frame.columns,
1197-
orient='index')
1202+
with tm.assert_produces_warning(FutureWarning,
1203+
check_stacklevel=False):
1204+
recons = DataFrame.from_items(row_items,
1205+
columns=self.mixed_frame.columns,
1206+
orient='index')
11981207
tm.assert_frame_equal(recons, self.mixed_frame)
11991208
assert isinstance(recons['foo'][0], tuple)
12001209

1201-
rs = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])],
1202-
orient='index',
1203-
columns=['one', 'two', 'three'])
1210+
with tm.assert_produces_warning(FutureWarning,
1211+
check_stacklevel=False):
1212+
rs = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])],
1213+
orient='index',
1214+
columns=['one', 'two', 'three'])
12041215
xp = DataFrame([[1, 2, 3], [4, 5, 6]], index=['A', 'B'],
12051216
columns=['one', 'two', 'three'])
12061217
tm.assert_frame_equal(rs, xp)
@@ -1210,12 +1221,28 @@ def test_constructor_from_items_scalars(self):
12101221
with tm.assert_raises_regex(ValueError,
12111222
'The value in each \(key, value\) '
12121223
'pair must be an array, Series, or dict'):
1213-
DataFrame.from_items([('A', 1), ('B', 4)])
1224+
with tm.assert_produces_warning(FutureWarning,
1225+
check_stacklevel=False):
1226+
DataFrame.from_items([('A', 1), ('B', 4)])
12141227

12151228
with tm.assert_raises_regex(ValueError,
12161229
'The value in each \(key, value\) '
12171230
'pair must be an array, Series, or dict'):
1218-
DataFrame.from_items([('A', 1), ('B', 2)], columns=['col1'],
1231+
with tm.assert_produces_warning(FutureWarning,
1232+
check_stacklevel=False):
1233+
DataFrame.from_items([('A', 1), ('B', 2)], columns=['col1'],
1234+
orient='index')
1235+
1236+
def test_from_items_deprecation(self):
1237+
# GH 17320
1238+
with tm.assert_produces_warning(FutureWarning,
1239+
check_stacklevel=False):
1240+
DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])])
1241+
1242+
with tm.assert_produces_warning(FutureWarning,
1243+
check_stacklevel=False):
1244+
DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])],
1245+
columns=['col1', 'col2', 'col3'],
12191246
orient='index')
12201247

12211248
def test_constructor_mix_series_nonseries(self):
@@ -1244,13 +1271,17 @@ def test_constructor_column_duplicates(self):
12441271

12451272
tm.assert_frame_equal(df, edf)
12461273

1247-
idf = DataFrame.from_items(
1248-
[('a', [8]), ('a', [5])], columns=['a', 'a'])
1274+
with tm.assert_produces_warning(FutureWarning,
1275+
check_stacklevel=False):
1276+
idf = DataFrame.from_items([('a', [8]), ('a', [5])],
1277+
columns=['a', 'a'])
12491278
tm.assert_frame_equal(idf, edf)
12501279

1251-
pytest.raises(ValueError, DataFrame.from_items,
1252-
[('a', [8]), ('a', [5]), ('b', [6])],
1253-
columns=['b', 'a', 'a'])
1280+
with tm.assert_produces_warning(FutureWarning,
1281+
check_stacklevel=False):
1282+
pytest.raises(ValueError, DataFrame.from_items,
1283+
[('a', [8]), ('a', [5]), ('b', [6])],
1284+
columns=['b', 'a', 'a'])
12541285

12551286
def test_constructor_empty_with_string_dtype(self):
12561287
# GH 9428

pandas/tests/frame/test_nonunique_indexes.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,10 @@ def check(result, expected=None):
214214
for index in [df.index, pd.Index(list('edcba'))]:
215215
this_df = df.copy()
216216
expected_ser = pd.Series(index.values, index=this_df.index)
217-
expected_df = DataFrame.from_items([('A', expected_ser),
218-
('B', this_df['B']),
219-
('A', expected_ser)])
217+
expected_df = DataFrame({'A': expected_ser,
218+
'B': this_df['B'],
219+
'A': expected_ser},
220+
columns=['A', 'B', 'A'])
220221
this_df['A'] = index
221222
check(this_df, expected_df)
222223

pandas/tests/io/parser/common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -924,8 +924,8 @@ def test_float_parser(self):
924924

925925
def test_scientific_no_exponent(self):
926926
# see gh-12215
927-
df = DataFrame.from_items([('w', ['2e']), ('x', ['3E']),
928-
('y', ['42e']), ('z', ['632E'])])
927+
df = DataFrame({'w': ['2e'], 'x': ['3E'],
928+
'y': ['42e'], 'z': ['632E']})
929929
data = df.to_csv(index=False)
930930
for prec in self.float_precision_choices:
931931
df_roundtrip = self.read_csv(

pandas/tests/io/test_excel.py

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -320,17 +320,17 @@ def test_excel_table(self):
320320

321321
def test_reader_special_dtypes(self):
322322

323-
expected = DataFrame.from_items([
324-
("IntCol", [1, 2, -3, 4, 0]),
325-
("FloatCol", [1.25, 2.25, 1.83, 1.92, 0.0000000005]),
326-
("BoolCol", [True, False, True, True, False]),
327-
("StrCol", [1, 2, 3, 4, 5]),
323+
expected = DataFrame({
324+
"IntCol": [1, 2, -3, 4, 0],
325+
"FloatCol": [1.25, 2.25, 1.83, 1.92, 0.0000000005],
326+
"BoolCol": [True, False, True, True, False],
327+
"StrCol": [1, 2, 3, 4, 5],
328328
# GH5394 - this is why convert_float isn't vectorized
329-
("Str2Col", ["a", 3, "c", "d", "e"]),
330-
("DateCol", [datetime(2013, 10, 30), datetime(2013, 10, 31),
329+
"Str2Col": ["a", 3, "c", "d", "e"],
330+
"DateCol": [datetime(2013, 10, 30), datetime(2013, 10, 31),
331331
datetime(1905, 1, 1), datetime(2013, 12, 14),
332-
datetime(2015, 3, 14)])
333-
])
332+
datetime(2015, 3, 14)]
333+
}, columns=["IntCol", "FloatCol", "BoolCol", "StrCol", "Str2Col", "DateCol"])
334334

335335
basename = 'test_types'
336336

@@ -368,12 +368,12 @@ def test_reader_converters(self):
368368

369369
basename = 'test_converters'
370370

371-
expected = DataFrame.from_items([
372-
("IntCol", [1, 2, -3, -1000, 0]),
373-
("FloatCol", [12.5, np.nan, 18.3, 19.2, 0.000000005]),
374-
("BoolCol", ['Found', 'Found', 'Found', 'Not found', 'Found']),
375-
("StrCol", ['1', np.nan, '3', '4', '5']),
376-
])
371+
expected = DataFrame({
372+
"IntCol": [1, 2, -3, -1000, 0],
373+
"FloatCol": [12.5, np.nan, 18.3, 19.2, 0.000000005],
374+
"BoolCol": ['Found', 'Found', 'Found', 'Not found', 'Found'],
375+
"StrCol": ['1', np.nan, '3', '4', '5'],
376+
}, columns=['IntCol', 'FloatCol', 'BoolCol', 'StrCol'])
377377

378378
converters = {'IntCol': lambda x: int(x) if x != '' else -1000,
379379
'FloatCol': lambda x: 10 * x if x else np.nan,
@@ -724,32 +724,30 @@ def test_reader_seconds(self):
724724

725725
if LooseVersion(xlrd.__VERSION__) >= LooseVersion("0.9.3"):
726726
# Xlrd >= 0.9.3 can handle Excel milliseconds.
727-
expected = DataFrame.from_items([("Time",
728-
[time(1, 2, 3),
729-
time(2, 45, 56, 100000),
730-
time(4, 29, 49, 200000),
731-
time(6, 13, 42, 300000),
732-
time(7, 57, 35, 400000),
733-
time(9, 41, 28, 500000),
734-
time(11, 25, 21, 600000),
735-
time(13, 9, 14, 700000),
736-
time(14, 53, 7, 800000),
737-
time(16, 37, 0, 900000),
738-
time(18, 20, 54)])])
727+
expected = DataFrame({"Time": [time(1, 2, 3),
728+
time(2, 45, 56, 100000),
729+
time(4, 29, 49, 200000),
730+
time(6, 13, 42, 300000),
731+
time(7, 57, 35, 400000),
732+
time(9, 41, 28, 500000),
733+
time(11, 25, 21, 600000),
734+
time(13, 9, 14, 700000),
735+
time(14, 53, 7, 800000),
736+
time(16, 37, 0, 900000),
737+
time(18, 20, 54)]})
739738
else:
740739
# Xlrd < 0.9.3 rounds Excel milliseconds.
741-
expected = DataFrame.from_items([("Time",
742-
[time(1, 2, 3),
743-
time(2, 45, 56),
744-
time(4, 29, 49),
745-
time(6, 13, 42),
746-
time(7, 57, 35),
747-
time(9, 41, 29),
748-
time(11, 25, 22),
749-
time(13, 9, 15),
750-
time(14, 53, 8),
751-
time(16, 37, 1),
752-
time(18, 20, 54)])])
740+
expected = DataFrame({"Time": [time(1, 2, 3),
741+
time(2, 45, 56),
742+
time(4, 29, 49),
743+
time(6, 13, 42),
744+
time(7, 57, 35),
745+
time(9, 41, 29),
746+
time(11, 25, 22),
747+
time(13, 9, 15),
748+
time(14, 53, 8),
749+
time(16, 37, 1),
750+
time(18, 20, 54)]})
753751

754752
actual = self.get_exceldf('times_1900', 'Sheet1')
755753
tm.assert_frame_equal(actual, expected)
@@ -1855,7 +1853,7 @@ def test_datetimes(self):
18551853
datetime(2013, 1, 13, 18, 20, 52)]
18561854

18571855
with ensure_clean(self.ext) as path:
1858-
write_frame = DataFrame.from_items([('A', datetimes)])
1856+
write_frame = DataFrame({'A': datetimes})
18591857
write_frame.to_excel(path, 'Sheet1')
18601858
read_frame = read_excel(path, 'Sheet1', header=0)
18611859

pandas/tests/io/test_stata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ def test_categorical_order(self, file):
945945
cols.append((col, pd.Categorical.from_codes(codes, labels)))
946946
else:
947947
cols.append((col, pd.Series(labels, dtype=np.float32)))
948-
expected = DataFrame.from_items(cols)
948+
expected = DataFrame(dict(cols), columns=dict(cols).keys())
949949

950950
# Read with and with out categoricals, ensure order is identical
951951
file = getattr(self, file)

0 commit comments

Comments
 (0)