Skip to content

Commit 921ce47

Browse files
sinhrksjreback
authored andcommitted
BUG: pivot_table may raise TypeError without values
``pivot_table`` raises TypeError`` when ``index`` or ``columns`` is array-like and ``values`` is not specified. Author: sinhrks <[email protected]> Closes pandas-dev#14380 from sinhrks/pivot_table_bug and squashes the following commits: be426db [sinhrks] BUG: pivot_table may raise TypeError without values
1 parent 2d3a739 commit 921ce47

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

doc/source/whatsnew/v0.19.1.txt

+3
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,6 @@ Bug Fixes
5353
- Bug in ``MultiIndex.set_levels`` where illegal level values were still set after raising an error (:issue:`13754`)
5454
- Bug in ``DataFrame.to_json`` where ``lines=True`` and a value contained a ``}`` character (:issue:`14391`)
5555
- Bug in ``df.groupby`` causing an ``AttributeError`` when grouping a single index frame by a column and the index level (:issue`14327`)
56+
57+
- Bug in ``pd.pivot_table`` may raise ``TypeError`` or ``ValueError`` when ``index`` or ``columns``
58+
is not scalar and ``values`` is not specified (:issue:`14380`)

pandas/tools/pivot.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,7 @@ def pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
101101
else:
102102
values_multi = False
103103
values = [values]
104-
else:
105-
values = list(data.columns.drop(keys))
106104

107-
if values_passed:
108105
to_filter = []
109106
for x in keys + values:
110107
if isinstance(x, Grouper):
@@ -117,6 +114,15 @@ def pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
117114
if len(to_filter) < len(data.columns):
118115
data = data[to_filter]
119116

117+
else:
118+
values = data.columns
119+
for key in keys:
120+
try:
121+
values = values.drop(key)
122+
except (TypeError, ValueError):
123+
pass
124+
values = list(values)
125+
120126
grouped = data.groupby(keys)
121127
agged = grouped.agg(aggfunc)
122128

pandas/tools/tests/test_pivot.py

+33
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,39 @@ def test_pivot_dtypes(self):
131131
expected = Series(dict(float64=2))
132132
tm.assert_series_equal(result, expected)
133133

134+
def test_pivot_no_values(self):
135+
# GH 14380
136+
idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-01-02',
137+
'2011-01-01', '2011-01-02'])
138+
df = pd.DataFrame({'A': [1, 2, 3, 4, 5]},
139+
index=idx)
140+
res = df.pivot_table(index=df.index.month, columns=df.index.day)
141+
142+
exp_columns = pd.MultiIndex.from_tuples([('A', 1), ('A', 2)])
143+
exp = pd.DataFrame([[2.5, 4.0], [2.0, np.nan]],
144+
index=[1, 2], columns=exp_columns)
145+
tm.assert_frame_equal(res, exp)
146+
147+
df = pd.DataFrame({'A': [1, 2, 3, 4, 5],
148+
'dt': pd.date_range('2011-01-01', freq='D',
149+
periods=5)},
150+
index=idx)
151+
res = df.pivot_table(index=df.index.month,
152+
columns=pd.Grouper(key='dt', freq='M'))
153+
exp_columns = pd.MultiIndex.from_tuples([('A',
154+
pd.Timestamp('2011-01-31'))])
155+
exp_columns.names = [None, 'dt']
156+
exp = pd.DataFrame([3.25, 2.0],
157+
index=[1, 2], columns=exp_columns)
158+
tm.assert_frame_equal(res, exp)
159+
160+
res = df.pivot_table(index=pd.Grouper(freq='A'),
161+
columns=pd.Grouper(key='dt', freq='M'))
162+
exp = pd.DataFrame([3],
163+
index=pd.DatetimeIndex(['2011-12-31']),
164+
columns=exp_columns)
165+
tm.assert_frame_equal(res, exp)
166+
134167
def test_pivot_multi_values(self):
135168
result = pivot_table(self.data, values=['D', 'E'],
136169
index='A', columns=['B', 'C'], fill_value=0)

0 commit comments

Comments
 (0)