Skip to content

Commit 8d24977

Browse files
committed
DEPR: deprecate (DataFrame|Series).iteritems
1 parent 79feb99 commit 8d24977

30 files changed

+89
-77
lines changed

doc/source/development/contributing_docstring.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ examples:
522522
* ``loc`` and ``iloc``, as they do the same, but in one case providing indices
523523
and in the other positions
524524
* ``max`` and ``min``, as they do the opposite
525-
* ``iterrows``, ``itertuples`` and ``iteritems``, as it is easy that a user
525+
* ``iterrows``, ``itertuples`` and ``items``, as it is easy that a user
526526
looking for the method to iterate over columns ends up in the method to
527527
iterate over rows, and vice-versa
528528
* ``fillna`` and ``dropna``, as both methods are used to handle missing values

doc/source/getting_started/basics.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -1474,7 +1474,7 @@ Thus, for example, iterating over a DataFrame gives you the column names:
14741474
print(col)
14751475
14761476
1477-
Pandas objects also have the dict-like :meth:`~DataFrame.iteritems` method to
1477+
Pandas objects also have the dict-like :meth:`~DataFrame.items` method to
14781478
iterate over the (key, value) pairs.
14791479

14801480
To iterate over the rows of a DataFrame, you can use the following methods:
@@ -1523,10 +1523,10 @@ To iterate over the rows of a DataFrame, you can use the following methods:
15231523
15241524
df
15251525
1526-
iteritems
1526+
items
15271527
~~~~~~~~~
15281528

1529-
Consistent with the dict-like interface, :meth:`~DataFrame.iteritems` iterates
1529+
Consistent with the dict-like interface, :meth:`~DataFrame.items` iterates
15301530
through key-value pairs:
15311531

15321532
* **Series**: (index, scalar value) pairs
@@ -1536,7 +1536,7 @@ For example:
15361536

15371537
.. ipython:: python
15381538
1539-
for label, ser in df.iteritems():
1539+
for label, ser in df.items():
15401540
print(label)
15411541
print(ser)
15421542

doc/source/reference/frame.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Indexing, iteration
6868
DataFrame.__iter__
6969
DataFrame.items
7070
DataFrame.keys
71-
DataFrame.iteritems
71+
DataFrame.items
7272
DataFrame.iterrows
7373
DataFrame.itertuples
7474
DataFrame.lookup

doc/source/reference/series.rst

-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ Indexing, iteration
7676
Series.loc
7777
Series.iloc
7878
Series.__iter__
79-
Series.iteritems
8079
Series.items
8180
Series.keys
8281
Series.pop

doc/source/whatsnew/v0.25.0.rst

+2
Original file line numberDiff line numberDiff line change
@@ -830,8 +830,10 @@ Other deprecations
830830
- :meth:`Index.item` and :meth:`Series.item` is deprecated. (:issue:`18262`)
831831
- The default value ``ordered=None`` in :class:`~pandas.api.types.CategoricalDtype` has been deprecated in favor of ``ordered=False``. When converting between categorical types ``ordered=True`` must be explicitly passed in order to be preserved. (:issue:`26336`)
832832
- :meth:`Index.contains` is deprecated. Use ``key in index`` (``__contains__``) instead (:issue:`17753`).
833+
- ``DataFrame.iteritems`` and ``Series.iteritems`` have been deprecated. :attr:`DataFrame.items` and :attr:`Series.items` provide the exact same functionality and should be used instead (:issue:`26114`).
833834
- :meth:`DataFrame.get_dtype_counts` is deprecated. (:issue:`18262`)
834835
836+
835837
.. _whatsnew_0250.prior_deprecations:
836838
837839
Removal of prior version deprecations/changes

pandas/core/frame.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ def style(self):
689689
from pandas.io.formats.style import Styler
690690
return Styler(self)
691691

692-
def iteritems(self):
692+
def items(self):
693693
r"""
694694
Iterator over (column name, Series) pairs.
695695
@@ -720,7 +720,7 @@ def iteritems(self):
720720
panda bear 1864
721721
polar bear 22000
722722
koala marsupial 80000
723-
>>> for label, content in df.iteritems():
723+
>>> for label, content in df.items():
724724
... print('label:', label)
725725
... print('content:', content, sep='\n')
726726
...
@@ -761,7 +761,7 @@ def iterrows(self):
761761
See Also
762762
--------
763763
itertuples : Iterate over DataFrame rows as namedtuples of the values.
764-
iteritems : Iterate over (column name, Series) pairs.
764+
items : Iterate over (column name, Series) pairs.
765765
766766
Notes
767767
-----
@@ -819,7 +819,7 @@ def itertuples(self, index=True, name="Pandas"):
819819
--------
820820
DataFrame.iterrows : Iterate over DataFrame rows as (index, Series)
821821
pairs.
822-
DataFrame.iteritems : Iterate over (column name, Series) pairs.
822+
DataFrame.items : Iterate over (column name, Series) pairs.
823823
824824
Notes
825825
-----
@@ -876,7 +876,12 @@ def itertuples(self, index=True, name="Pandas"):
876876
# fallback to regular tuples
877877
return zip(*arrays)
878878

879-
items = iteritems
879+
@Appender(_shared_docs["iteritems"] % _shared_doc_kwargs)
880+
def iteritems(self):
881+
warnings.warn("'iteritems' is deprecated and will be removed in a "
882+
"future version. Please use `items` instead.",
883+
FutureWarning, stacklevel=2)
884+
return self.items()
880885

881886
def __len__(self):
882887
"""
@@ -2437,7 +2442,7 @@ def memory_usage(self, index=True, deep=False):
24372442
5216
24382443
"""
24392444
result = Series([c.memory_usage(index=False, deep=deep)
2440-
for col, c in self.iteritems()], index=self.columns)
2445+
for col, c in self.items()], index=self.columns)
24412446
if index:
24422447
result = Series(self.index.memory_usage(deep=deep),
24432448
index=['Index']).append(result)
@@ -4640,7 +4645,7 @@ def f(vals):
46404645
if not diff.empty:
46414646
raise KeyError(diff)
46424647

4643-
vals = (col.values for name, col in self.iteritems()
4648+
vals = (col.values for name, col in self.items()
46444649
if name in subset)
46454650
labels, shape = map(list, zip(*map(f, vals)))
46464651

@@ -6913,7 +6918,7 @@ def round(self, decimals=0, *args, **kwargs):
69136918
from pandas.core.reshape.concat import concat
69146919

69156920
def _dict_round(df, decimals):
6916-
for col, vals in df.iteritems():
6921+
for col, vals in df.items():
69176922
try:
69186923
yield _series_round(vals, decimals[col])
69196924
except KeyError:
@@ -6934,7 +6939,7 @@ def _series_round(s, decimals):
69346939
elif is_integer(decimals):
69356940
# Dispatch to Series.round
69366941
new_cols = [_series_round(v, decimals)
6937-
for _, v in self.iteritems()]
6942+
for _, v in self.items()]
69386943
else:
69396944
raise TypeError("decimals must be an integer, a dict-like or a "
69406945
"Series")

pandas/core/generic.py

+19-7
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ def _get_space_character_free_column_resolvers(self):
437437
from pandas.core.computation.common import _remove_spaces_column_name
438438

439439
return {_remove_spaces_column_name(k): v for k, v
440-
in self.iteritems()}
440+
in self.items()}
441441

442442
@property
443443
def _info_axis(self):
@@ -1838,15 +1838,27 @@ def keys(self):
18381838
"""
18391839
return self._info_axis
18401840

1841-
def iteritems(self):
1842-
"""
1843-
Iterate over (label, values) on info axis
1841+
def items(self):
1842+
"""Iterate over (label, values) on info axis
18441843
1845-
This is index for Series, columns for DataFrame and so on.
1844+
This is index for Series and columns for DataFrame.
18461845
"""
18471846
for h in self._info_axis:
18481847
yield h, self[h]
18491848

1849+
_shared_docs['iteritems'] = ("""Iterate over (label, values) on info axis
1850+
1851+
.. deprecated :: 0.25.0
1852+
Use :attr:`%(klass)s.items` instead.
1853+
""")
1854+
1855+
@Appender(_shared_docs["iteritems"] % _shared_doc_kwargs)
1856+
def iteritems(self):
1857+
warnings.warn("'iteritems' is deprecated and will be removed in a "
1858+
"future version. Please use `items` instead.",
1859+
FutureWarning, stacklevel=2)
1860+
return self.items()
1861+
18501862
def __len__(self):
18511863
"""Returns length of info axis"""
18521864
return len(self._info_axis)
@@ -5589,7 +5601,7 @@ def astype(self, dtype, copy=True, errors='raise', **kwargs):
55895601
raise KeyError('Only a column name can be used for the '
55905602
'key in a dtype mappings argument.')
55915603
results = []
5592-
for col_name, col in self.iteritems():
5604+
for col_name, col in self.items():
55935605
if col_name in dtype:
55945606
results.append(col.astype(dtype=dtype[col_name], copy=copy,
55955607
errors=errors, **kwargs))
@@ -9707,7 +9719,7 @@ def describe_1d(data):
97079719
else:
97089720
data = self.select_dtypes(include=include, exclude=exclude)
97099721

9710-
ldesc = [describe_1d(s) for _, s in data.iteritems()]
9722+
ldesc = [describe_1d(s) for _, s in data.items()]
97119723
# set a convenient order for rows
97129724
names = []
97139725
ldesc_indexes = sorted((x.index for x in ldesc), key=len)

pandas/core/indexes/multi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ def from_frame(cls, df, sortorder=None, names=None):
566566
if not isinstance(df, ABCDataFrame):
567567
raise TypeError("Input must be a DataFrame")
568568

569-
column_names, columns = zip(*df.iteritems())
569+
column_names, columns = zip(*df.items())
570570
names = column_names if names is None else names
571571
return cls.from_arrays(columns, sortorder=sortorder, names=names)
572572

pandas/core/panel.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ def to_excel(self, path, na_rep='', engine=None, **kwargs):
451451
writer = path
452452
kwargs['na_rep'] = na_rep
453453

454-
for item, df in self.iteritems():
454+
for item, df in self.items():
455455
name = str(item)
456456
df.to_excel(writer, name, **kwargs)
457457
writer.save()

pandas/core/reshape/pivot.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def _compute_grand_margin(data, values, aggfunc,
223223

224224
if values:
225225
grand_margin = {}
226-
for k, v in data[values].iteritems():
226+
for k, v in data[values].items():
227227
try:
228228
if isinstance(aggfunc, str):
229229
grand_margin[k] = getattr(v, aggfunc)()

pandas/core/reshape/reshape.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ def _unstack_extension_series(series, level, fill_value):
447447
out = []
448448
values = extract_array(series, extract_numpy=False)
449449

450-
for col, indices in result.iteritems():
450+
for col, indices in result.items():
451451
out.append(Series(values.take(indices.values,
452452
allow_fill=True,
453453
fill_value=fill_value),
@@ -506,7 +506,7 @@ def factorize(index):
506506
if is_extension_array_dtype(dtype):
507507
arr = dtype.construct_array_type()
508508
new_values = arr._concat_same_type([
509-
col._values for _, col in frame.iteritems()
509+
col._values for _, col in frame.items()
510510
])
511511
new_values = _reorder_for_extension_array_stack(new_values, N, K)
512512
else:
@@ -647,7 +647,7 @@ def _convert_level_number(level_num, columns):
647647
subset = this[this.columns[loc]]
648648

649649
value_slice = dtype.construct_array_type()._concat_same_type(
650-
[x._values for _, x in subset.iteritems()]
650+
[x._values for _, x in subset.items()]
651651
)
652652
N, K = this.shape
653653
idx = np.arange(N * K).reshape(K, N).T.ravel()
@@ -850,7 +850,7 @@ def check_len(item, name):
850850
# columns to prepend to result.
851851
with_dummies = [data.select_dtypes(exclude=dtypes_to_encode)]
852852

853-
for (col, pre, sep) in zip(data_to_encode.iteritems(), prefix,
853+
for (col, pre, sep) in zip(data_to_encode.items(), prefix,
854854
prefix_sep):
855855
# col is (column_name, column), use just column data here
856856
dummy = _get_dummies_1d(col[1], prefix=pre, prefix_sep=sep,

pandas/core/series.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -1572,13 +1572,12 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None, header=True,
15721572

15731573
# ----------------------------------------------------------------------
15741574

1575-
def iteritems(self):
1575+
def items(self):
15761576
"""
15771577
Lazily iterate over (index, value) tuples.
15781578
15791579
This method returns an iterable tuple (index, value). This is
1580-
convenient if you want to create a lazy iterator. Note that the
1581-
methods Series.items and Series.iteritems are the same methods.
1580+
convenient if you want to create a lazy iterator.
15821581
15831582
Returns
15841583
-------
@@ -1588,20 +1587,25 @@ def iteritems(self):
15881587
15891588
See Also
15901589
--------
1591-
DataFrame.iteritems : Equivalent to Series.iteritems for DataFrame.
1590+
DataFrame.items : Equivalent to Series.items for DataFrame.
15921591
15931592
Examples
15941593
--------
15951594
>>> s = pd.Series(['A', 'B', 'C'])
1596-
>>> for index, value in s.iteritems():
1595+
>>> for index, value in s.items():
15971596
... print("Index : {}, Value : {}".format(index, value))
15981597
Index : 0, Value : A
15991598
Index : 1, Value : B
16001599
Index : 2, Value : C
16011600
"""
16021601
return zip(iter(self.index), iter(self))
16031602

1604-
items = iteritems
1603+
@Appender(generic._shared_docs["iteritems"] % _shared_doc_kwargs)
1604+
def iteritems(self):
1605+
warnings.warn("'iteritems' is deprecated and will be removed in a "
1606+
"future version. Please use `items` instead.",
1607+
FutureWarning, stacklevel=2)
1608+
return self.items()
16051609

16061610
# ----------------------------------------------------------------------
16071611
# Misc public methods

pandas/core/sparse/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ def _reindex_index(self, index, method, copy, level, fill_value=np.nan,
630630
need_mask = mask.any()
631631

632632
new_series = {}
633-
for col, series in self.iteritems():
633+
for col, series in self.items():
634634
if mask.all():
635635
continue
636636

pandas/core/strings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,7 @@ def str_extractall(arr, pat, flags=0):
976976
index_list = []
977977
is_mi = arr.index.nlevels > 1
978978

979-
for subject_key, subject in arr.iteritems():
979+
for subject_key, subject in arr.items():
980980
if isinstance(subject, str):
981981

982982
if not is_mi:

pandas/core/util/hashing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def hash_pandas_object(obj, index=True, encoding='utf8', hash_key=None,
9999
h = Series(h, index=obj.index, dtype='uint64', copy=False)
100100

101101
elif isinstance(obj, ABCDataFrame):
102-
hashes = (hash_array(series.values) for _, series in obj.iteritems())
102+
hashes = (hash_array(series.values) for _, series in obj.items())
103103
num_items = len(obj.columns)
104104
if index:
105105
index_hash_generator = (hash_pandas_object(obj.index,

pandas/io/formats/style.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ def _update_ctx(self, attrs):
478478
matter.
479479
"""
480480
for row_label, v in attrs.iterrows():
481-
for col_label, col in v.iteritems():
481+
for col_label, col in v.items():
482482
i = self.index.get_indexer([row_label])[0]
483483
j = self.columns.get_indexer([col_label])[0]
484484
for pair in col.rstrip(";").split(";"):

pandas/io/json/json.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ def _process_converter(self, f, filt=None):
909909

910910
needs_new_obj = False
911911
new_obj = dict()
912-
for i, (col, c) in enumerate(self.obj.iteritems()):
912+
for i, (col, c) in enumerate(self.obj.items()):
913913
if filt(col, c):
914914
new_data, result = f(col, c)
915915
if result:

pandas/io/json/table_schema.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ def build_table_schema(data, index=True, primary_key=None, version=True):
240240
fields.append(convert_pandas_type_to_json_field(data.index))
241241

242242
if data.ndim > 1:
243-
for column, s in data.iteritems():
243+
for column, s in data.items():
244244
fields.append(convert_pandas_type_to_json_field(s))
245245
else:
246246
fields.append(convert_pandas_type_to_json_field(data))

pandas/io/msgpack/_packer.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ cdef class Packer:
194194
raise ValueError("dict is too large")
195195
ret = msgpack_pack_map(&self.pk, L)
196196
if ret == 0:
197-
for k, v in d.iteritems():
197+
for k, v in d.items():
198198
ret = self._pack(k, nest_limit - 1)
199199
if ret != 0: break
200200
ret = self._pack(v, nest_limit - 1)

pandas/io/sql.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def _parse_date_columns(data_frame, parse_dates):
105105
# we want to coerce datetime64_tz dtypes for now to UTC
106106
# we could in theory do a 'nice' conversion from a FixedOffset tz
107107
# GH11216
108-
for col_name, df_col in data_frame.iteritems():
108+
for col_name, df_col in data_frame.items():
109109
if is_datetime64tz_dtype(df_col) or col_name in parse_dates:
110110
try:
111111
fmt = parse_dates[col_name]

0 commit comments

Comments
 (0)