Skip to content

Commit 27f7365

Browse files
authored
BUG: transpose inferring dtype for dt in object column (#51565)
* BUG: transpose inferring dtype for dt in object column * Address review * Move whatsnew * Clean
1 parent 7b855c1 commit 27f7365

File tree

4 files changed

+53
-6
lines changed

4 files changed

+53
-6
lines changed

doc/source/whatsnew/v2.1.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ Groupby/resample/rolling
197197

198198
Reshaping
199199
^^^^^^^^^
200-
-
200+
- Bug in :meth:`DataFrame.transpose` inferring dtype for object column (:issue:`51546`)
201201
-
202202

203203
Sparse

pandas/core/frame.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -3577,7 +3577,11 @@ def transpose(self, *args, copy: bool = False) -> DataFrame:
35773577
new_vals = new_vals.copy()
35783578

35793579
result = self._constructor(
3580-
new_vals, index=self.columns, columns=self.index, copy=False
3580+
new_vals,
3581+
index=self.columns,
3582+
columns=self.index,
3583+
copy=False,
3584+
dtype=new_vals.dtype,
35813585
)
35823586
if using_copy_on_write() and len(self) > 0:
35833587
result._mgr.add_references(self._mgr) # type: ignore[arg-type]
@@ -3599,7 +3603,9 @@ def transpose(self, *args, copy: bool = False) -> DataFrame:
35993603
new_arr = self.values.T
36003604
if copy:
36013605
new_arr = new_arr.copy()
3602-
result = self._constructor(new_arr, index=self.columns, columns=self.index)
3606+
result = self._constructor(
3607+
new_arr, index=self.columns, columns=self.index, dtype=new_arr.dtype
3608+
)
36033609

36043610
return result.__finalize__(self, method="transpose")
36053611

pandas/tests/frame/methods/test_transpose.py

+43-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
DataFrame,
88
DatetimeIndex,
99
IntervalIndex,
10+
Series,
11+
Timestamp,
1012
date_range,
1113
timedelta_range,
1214
)
@@ -63,7 +65,7 @@ def test_transpose_tzaware_2col_mixed_tz(self):
6365
df4 = DataFrame({"A": dti, "B": dti2})
6466
assert (df4.dtypes == [dti.dtype, dti2.dtype]).all()
6567
assert (df4.T.dtypes == object).all()
66-
tm.assert_frame_equal(df4.T.T, df4)
68+
tm.assert_frame_equal(df4.T.T, df4.astype(object))
6769

6870
@pytest.mark.parametrize("tz", [None, "America/New_York"])
6971
def test_transpose_preserves_dtindex_equality_with_dst(self, tz):
@@ -83,7 +85,7 @@ def test_transpose_object_to_tzaware_mixed_tz(self):
8385
df2 = DataFrame([dti, dti2])
8486
assert (df2.dtypes == object).all()
8587
res2 = df2.T
86-
assert (res2.dtypes == [dti.dtype, dti2.dtype]).all()
88+
assert (res2.dtypes == object).all()
8789

8890
def test_transpose_uint64(self, uint64_frame):
8991
result = uint64_frame.T
@@ -128,3 +130,42 @@ def test_transpose_get_view_dt64tzget_view(self):
128130

129131
rtrip = result._mgr.blocks[0].values
130132
assert np.shares_memory(arr._ndarray, rtrip._ndarray)
133+
134+
def test_transpose_not_inferring_dt(self):
135+
# GH#51546
136+
df = DataFrame(
137+
{
138+
"a": [Timestamp("2019-12-31"), Timestamp("2019-12-31")],
139+
},
140+
dtype=object,
141+
)
142+
result = df.T
143+
expected = DataFrame(
144+
[[Timestamp("2019-12-31"), Timestamp("2019-12-31")]],
145+
columns=[0, 1],
146+
index=["a"],
147+
dtype=object,
148+
)
149+
tm.assert_frame_equal(result, expected)
150+
151+
def test_transpose_not_inferring_dt_mixed_blocks(self):
152+
# GH#51546
153+
df = DataFrame(
154+
{
155+
"a": Series(
156+
[Timestamp("2019-12-31"), Timestamp("2019-12-31")], dtype=object
157+
),
158+
"b": [Timestamp("2019-12-31"), Timestamp("2019-12-31")],
159+
}
160+
)
161+
result = df.T
162+
expected = DataFrame(
163+
[
164+
[Timestamp("2019-12-31"), Timestamp("2019-12-31")],
165+
[Timestamp("2019-12-31"), Timestamp("2019-12-31")],
166+
],
167+
columns=[0, 1],
168+
index=["a", "b"],
169+
dtype=object,
170+
)
171+
tm.assert_frame_equal(result, expected)

pandas/tests/groupby/test_quantile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ def test_groupby_quantile_dt64tz_period():
467467

468468
# Check that we match the group-by-group result
469469
exp = {i: df.iloc[i::5].quantile(0.5) for i in range(5)}
470-
expected = DataFrame(exp).T
470+
expected = DataFrame(exp).T.infer_objects()
471471
expected.index = expected.index.astype(np.int_)
472472

473473
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)