test_index_as_string.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. import pandas._testing as tm
  5. @pytest.fixture(params=[["inner"], ["inner", "outer"]])
  6. def frame(request):
  7. levels = request.param
  8. df = pd.DataFrame(
  9. {
  10. "outer": ["a", "a", "a", "b", "b", "b"],
  11. "inner": [1, 2, 3, 1, 2, 3],
  12. "A": np.arange(6),
  13. "B": ["one", "one", "two", "two", "one", "one"],
  14. }
  15. )
  16. if levels:
  17. df = df.set_index(levels)
  18. return df
  19. @pytest.fixture()
  20. def series():
  21. df = pd.DataFrame(
  22. {
  23. "outer": ["a", "a", "a", "b", "b", "b"],
  24. "inner": [1, 2, 3, 1, 2, 3],
  25. "A": np.arange(6),
  26. "B": ["one", "one", "two", "two", "one", "one"],
  27. }
  28. )
  29. s = df.set_index(["outer", "inner", "B"])["A"]
  30. return s
  31. @pytest.mark.parametrize(
  32. "key_strs,groupers",
  33. [
  34. ("inner", pd.Grouper(level="inner")), # Index name
  35. (["inner"], [pd.Grouper(level="inner")]), # List of index name
  36. (["B", "inner"], ["B", pd.Grouper(level="inner")]), # Column and index
  37. (["inner", "B"], [pd.Grouper(level="inner"), "B"]), # Index and column
  38. ],
  39. )
  40. def test_grouper_index_level_as_string(frame, key_strs, groupers):
  41. if "B" not in key_strs or "outer" in frame.columns:
  42. result = frame.groupby(key_strs).mean(numeric_only=True)
  43. expected = frame.groupby(groupers).mean(numeric_only=True)
  44. else:
  45. result = frame.groupby(key_strs).mean()
  46. expected = frame.groupby(groupers).mean()
  47. tm.assert_frame_equal(result, expected)
  48. @pytest.mark.parametrize(
  49. "levels",
  50. [
  51. "inner",
  52. "outer",
  53. "B",
  54. ["inner"],
  55. ["outer"],
  56. ["B"],
  57. ["inner", "outer"],
  58. ["outer", "inner"],
  59. ["inner", "outer", "B"],
  60. ["B", "outer", "inner"],
  61. ],
  62. )
  63. def test_grouper_index_level_as_string_series(series, levels):
  64. # Compute expected result
  65. if isinstance(levels, list):
  66. groupers = [pd.Grouper(level=lv) for lv in levels]
  67. else:
  68. groupers = pd.Grouper(level=levels)
  69. expected = series.groupby(groupers).mean()
  70. # Compute and check result
  71. result = series.groupby(levels).mean()
  72. tm.assert_series_equal(result, expected)