test_transpose.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import numpy as np
  2. import pytest
  3. import pandas.util._test_decorators as td
  4. import pandas as pd
  5. from pandas import (
  6. DataFrame,
  7. DatetimeIndex,
  8. Index,
  9. IntervalIndex,
  10. Series,
  11. Timestamp,
  12. bdate_range,
  13. date_range,
  14. timedelta_range,
  15. )
  16. import pandas._testing as tm
  17. class TestTranspose:
  18. def test_transpose_td64_intervals(self):
  19. # GH#44917
  20. tdi = timedelta_range("0 Days", "3 Days")
  21. ii = IntervalIndex.from_breaks(tdi)
  22. ii = ii.insert(-1, np.nan)
  23. df = DataFrame(ii)
  24. result = df.T
  25. expected = DataFrame({i: ii[i : i + 1] for i in range(len(ii))})
  26. tm.assert_frame_equal(result, expected)
  27. def test_transpose_empty_preserves_datetimeindex(self):
  28. # GH#41382
  29. dti = DatetimeIndex([], dtype="M8[ns]")
  30. df = DataFrame(index=dti)
  31. expected = DatetimeIndex([], dtype="datetime64[ns]", freq=None)
  32. result1 = df.T.sum().index
  33. result2 = df.sum(axis=1).index
  34. tm.assert_index_equal(result1, expected)
  35. tm.assert_index_equal(result2, expected)
  36. def test_transpose_tzaware_1col_single_tz(self):
  37. # GH#26825
  38. dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
  39. df = DataFrame(dti)
  40. assert (df.dtypes == dti.dtype).all()
  41. res = df.T
  42. assert (res.dtypes == dti.dtype).all()
  43. def test_transpose_tzaware_2col_single_tz(self):
  44. # GH#26825
  45. dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
  46. df3 = DataFrame({"A": dti, "B": dti})
  47. assert (df3.dtypes == dti.dtype).all()
  48. res3 = df3.T
  49. assert (res3.dtypes == dti.dtype).all()
  50. def test_transpose_tzaware_2col_mixed_tz(self):
  51. # GH#26825
  52. dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
  53. dti2 = dti.tz_convert("US/Pacific")
  54. df4 = DataFrame({"A": dti, "B": dti2})
  55. assert (df4.dtypes == [dti.dtype, dti2.dtype]).all()
  56. assert (df4.T.dtypes == object).all()
  57. tm.assert_frame_equal(df4.T.T, df4.astype(object))
  58. @pytest.mark.parametrize("tz", [None, "America/New_York"])
  59. def test_transpose_preserves_dtindex_equality_with_dst(self, tz):
  60. # GH#19970
  61. idx = date_range("20161101", "20161130", freq="4h", tz=tz)
  62. df = DataFrame({"a": range(len(idx)), "b": range(len(idx))}, index=idx)
  63. result = df.T == df.T
  64. expected = DataFrame(True, index=list("ab"), columns=idx)
  65. tm.assert_frame_equal(result, expected)
  66. def test_transpose_object_to_tzaware_mixed_tz(self):
  67. # GH#26825
  68. dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
  69. dti2 = dti.tz_convert("US/Pacific")
  70. # mixed all-tzaware dtypes
  71. df2 = DataFrame([dti, dti2])
  72. assert (df2.dtypes == object).all()
  73. res2 = df2.T
  74. assert (res2.dtypes == object).all()
  75. def test_transpose_uint64(self):
  76. df = DataFrame(
  77. {"A": np.arange(3), "B": [2**63, 2**63 + 5, 2**63 + 10]},
  78. dtype=np.uint64,
  79. )
  80. result = df.T
  81. expected = DataFrame(df.values.T)
  82. expected.index = ["A", "B"]
  83. tm.assert_frame_equal(result, expected)
  84. def test_transpose_float(self, float_frame):
  85. frame = float_frame
  86. dft = frame.T
  87. for idx, series in dft.items():
  88. for col, value in series.items():
  89. if np.isnan(value):
  90. assert np.isnan(frame[col][idx])
  91. else:
  92. assert value == frame[col][idx]
  93. def test_transpose_mixed(self):
  94. # mixed type
  95. mixed = DataFrame(
  96. {
  97. "A": [0.0, 1.0, 2.0, 3.0, 4.0],
  98. "B": [0.0, 1.0, 0.0, 1.0, 0.0],
  99. "C": ["foo1", "foo2", "foo3", "foo4", "foo5"],
  100. "D": bdate_range("1/1/2009", periods=5),
  101. },
  102. index=Index(["a", "b", "c", "d", "e"], dtype=object),
  103. )
  104. mixed_T = mixed.T
  105. for col, s in mixed_T.items():
  106. assert s.dtype == np.object_
  107. @td.skip_array_manager_invalid_test
  108. def test_transpose_get_view(self, float_frame, using_copy_on_write):
  109. dft = float_frame.T
  110. dft.iloc[:, 5:10] = 5
  111. if using_copy_on_write:
  112. assert (float_frame.values[5:10] != 5).all()
  113. else:
  114. assert (float_frame.values[5:10] == 5).all()
  115. @td.skip_array_manager_invalid_test
  116. def test_transpose_get_view_dt64tzget_view(self, using_copy_on_write):
  117. dti = date_range("2016-01-01", periods=6, tz="US/Pacific")
  118. arr = dti._data.reshape(3, 2)
  119. df = DataFrame(arr)
  120. assert df._mgr.nblocks == 1
  121. result = df.T
  122. assert result._mgr.nblocks == 1
  123. rtrip = result._mgr.blocks[0].values
  124. if using_copy_on_write:
  125. assert np.shares_memory(df._mgr.blocks[0].values._ndarray, rtrip._ndarray)
  126. else:
  127. assert np.shares_memory(arr._ndarray, rtrip._ndarray)
  128. def test_transpose_not_inferring_dt(self):
  129. # GH#51546
  130. df = DataFrame(
  131. {
  132. "a": [Timestamp("2019-12-31"), Timestamp("2019-12-31")],
  133. },
  134. dtype=object,
  135. )
  136. result = df.T
  137. expected = DataFrame(
  138. [[Timestamp("2019-12-31"), Timestamp("2019-12-31")]],
  139. columns=[0, 1],
  140. index=["a"],
  141. dtype=object,
  142. )
  143. tm.assert_frame_equal(result, expected)
  144. def test_transpose_not_inferring_dt_mixed_blocks(self):
  145. # GH#51546
  146. df = DataFrame(
  147. {
  148. "a": Series(
  149. [Timestamp("2019-12-31"), Timestamp("2019-12-31")], dtype=object
  150. ),
  151. "b": [Timestamp("2019-12-31"), Timestamp("2019-12-31")],
  152. }
  153. )
  154. result = df.T
  155. expected = DataFrame(
  156. [
  157. [Timestamp("2019-12-31"), Timestamp("2019-12-31")],
  158. [Timestamp("2019-12-31"), Timestamp("2019-12-31")],
  159. ],
  160. columns=[0, 1],
  161. index=["a", "b"],
  162. dtype=object,
  163. )
  164. tm.assert_frame_equal(result, expected)
  165. @pytest.mark.parametrize("dtype1", ["Int64", "Float64"])
  166. @pytest.mark.parametrize("dtype2", ["Int64", "Float64"])
  167. def test_transpose(self, dtype1, dtype2):
  168. # GH#57315 - transpose should have F contiguous blocks
  169. df = DataFrame(
  170. {
  171. "a": pd.array([1, 1, 2], dtype=dtype1),
  172. "b": pd.array([3, 4, 5], dtype=dtype2),
  173. }
  174. )
  175. result = df.T
  176. for blk in result._mgr.blocks:
  177. # When dtypes are unequal, we get NumPy object array
  178. data = blk.values._data if dtype1 == dtype2 else blk.values
  179. assert data.flags["F_CONTIGUOUS"]