test_series.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import numpy as np
  2. import pytest
  3. from pandas import (
  4. DataFrame,
  5. DatetimeIndex,
  6. Index,
  7. MultiIndex,
  8. Series,
  9. concat,
  10. date_range,
  11. )
  12. import pandas._testing as tm
  13. class TestSeriesConcat:
  14. def test_concat_series(self):
  15. ts = tm.makeTimeSeries()
  16. ts.name = "foo"
  17. pieces = [ts[:5], ts[5:15], ts[15:]]
  18. result = concat(pieces)
  19. tm.assert_series_equal(result, ts)
  20. assert result.name == ts.name
  21. result = concat(pieces, keys=[0, 1, 2])
  22. expected = ts.copy()
  23. ts.index = DatetimeIndex(np.array(ts.index.values, dtype="M8[ns]"))
  24. exp_codes = [np.repeat([0, 1, 2], [len(x) for x in pieces]), np.arange(len(ts))]
  25. exp_index = MultiIndex(levels=[[0, 1, 2], ts.index], codes=exp_codes)
  26. expected.index = exp_index
  27. tm.assert_series_equal(result, expected)
  28. def test_concat_empty_and_non_empty_series_regression(self):
  29. # GH 18187 regression test
  30. s1 = Series([1])
  31. s2 = Series([], dtype=object)
  32. expected = s1
  33. result = concat([s1, s2])
  34. tm.assert_series_equal(result, expected)
  35. def test_concat_series_axis1(self):
  36. ts = tm.makeTimeSeries()
  37. pieces = [ts[:-2], ts[2:], ts[2:-2]]
  38. result = concat(pieces, axis=1)
  39. expected = DataFrame(pieces).T
  40. tm.assert_frame_equal(result, expected)
  41. result = concat(pieces, keys=["A", "B", "C"], axis=1)
  42. expected = DataFrame(pieces, index=["A", "B", "C"]).T
  43. tm.assert_frame_equal(result, expected)
  44. def test_concat_series_axis1_preserves_series_names(self):
  45. # preserve series names, #2489
  46. s = Series(np.random.randn(5), name="A")
  47. s2 = Series(np.random.randn(5), name="B")
  48. result = concat([s, s2], axis=1)
  49. expected = DataFrame({"A": s, "B": s2})
  50. tm.assert_frame_equal(result, expected)
  51. s2.name = None
  52. result = concat([s, s2], axis=1)
  53. tm.assert_index_equal(result.columns, Index(["A", 0], dtype="object"))
  54. def test_concat_series_axis1_with_reindex(self, sort):
  55. # must reindex, #2603
  56. s = Series(np.random.randn(3), index=["c", "a", "b"], name="A")
  57. s2 = Series(np.random.randn(4), index=["d", "a", "b", "c"], name="B")
  58. result = concat([s, s2], axis=1, sort=sort)
  59. expected = DataFrame({"A": s, "B": s2}, index=["c", "a", "b", "d"])
  60. if sort:
  61. expected = expected.sort_index()
  62. tm.assert_frame_equal(result, expected)
  63. def test_concat_series_axis1_names_applied(self):
  64. # ensure names argument is not ignored on axis=1, #23490
  65. s = Series([1, 2, 3])
  66. s2 = Series([4, 5, 6])
  67. result = concat([s, s2], axis=1, keys=["a", "b"], names=["A"])
  68. expected = DataFrame(
  69. [[1, 4], [2, 5], [3, 6]], columns=Index(["a", "b"], name="A")
  70. )
  71. tm.assert_frame_equal(result, expected)
  72. result = concat([s, s2], axis=1, keys=[("a", 1), ("b", 2)], names=["A", "B"])
  73. expected = DataFrame(
  74. [[1, 4], [2, 5], [3, 6]],
  75. columns=MultiIndex.from_tuples([("a", 1), ("b", 2)], names=["A", "B"]),
  76. )
  77. tm.assert_frame_equal(result, expected)
  78. def test_concat_series_axis1_same_names_ignore_index(self):
  79. dates = date_range("01-Jan-2013", "01-Jan-2014", freq="MS")[0:-1]
  80. s1 = Series(np.random.randn(len(dates)), index=dates, name="value")
  81. s2 = Series(np.random.randn(len(dates)), index=dates, name="value")
  82. result = concat([s1, s2], axis=1, ignore_index=True)
  83. expected = Index(range(2))
  84. tm.assert_index_equal(result.columns, expected, exact=True)
  85. @pytest.mark.parametrize(
  86. "s1name,s2name", [(np.int64(190), (43, 0)), (190, (43, 0))]
  87. )
  88. def test_concat_series_name_npscalar_tuple(self, s1name, s2name):
  89. # GH21015
  90. s1 = Series({"a": 1, "b": 2}, name=s1name)
  91. s2 = Series({"c": 5, "d": 6}, name=s2name)
  92. result = concat([s1, s2])
  93. expected = Series({"a": 1, "b": 2, "c": 5, "d": 6})
  94. tm.assert_series_equal(result, expected)
  95. def test_concat_series_partial_columns_names(self):
  96. # GH10698
  97. named_series = Series([1, 2], name="foo")
  98. unnamed_series1 = Series([1, 2])
  99. unnamed_series2 = Series([4, 5])
  100. result = concat([named_series, unnamed_series1, unnamed_series2], axis=1)
  101. expected = DataFrame(
  102. {"foo": [1, 2], 0: [1, 2], 1: [4, 5]}, columns=["foo", 0, 1]
  103. )
  104. tm.assert_frame_equal(result, expected)
  105. result = concat(
  106. [named_series, unnamed_series1, unnamed_series2],
  107. axis=1,
  108. keys=["red", "blue", "yellow"],
  109. )
  110. expected = DataFrame(
  111. {"red": [1, 2], "blue": [1, 2], "yellow": [4, 5]},
  112. columns=["red", "blue", "yellow"],
  113. )
  114. tm.assert_frame_equal(result, expected)
  115. result = concat(
  116. [named_series, unnamed_series1, unnamed_series2], axis=1, ignore_index=True
  117. )
  118. expected = DataFrame({0: [1, 2], 1: [1, 2], 2: [4, 5]})
  119. tm.assert_frame_equal(result, expected)
  120. def test_concat_series_length_one_reversed(self, frame_or_series):
  121. # GH39401
  122. obj = frame_or_series([100])
  123. result = concat([obj.iloc[::-1]])
  124. tm.assert_equal(result, obj)