test_assign.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import pytest
  2. from pandas import DataFrame
  3. import pandas._testing as tm
  4. class TestAssign:
  5. def test_assign(self):
  6. df = DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
  7. original = df.copy()
  8. result = df.assign(C=df.B / df.A)
  9. expected = df.copy()
  10. expected["C"] = [4, 2.5, 2]
  11. tm.assert_frame_equal(result, expected)
  12. # lambda syntax
  13. result = df.assign(C=lambda x: x.B / x.A)
  14. tm.assert_frame_equal(result, expected)
  15. # original is unmodified
  16. tm.assert_frame_equal(df, original)
  17. # Non-Series array-like
  18. result = df.assign(C=[4, 2.5, 2])
  19. tm.assert_frame_equal(result, expected)
  20. # original is unmodified
  21. tm.assert_frame_equal(df, original)
  22. result = df.assign(B=df.B / df.A)
  23. expected = expected.drop("B", axis=1).rename(columns={"C": "B"})
  24. tm.assert_frame_equal(result, expected)
  25. # overwrite
  26. result = df.assign(A=df.A + df.B)
  27. expected = df.copy()
  28. expected["A"] = [5, 7, 9]
  29. tm.assert_frame_equal(result, expected)
  30. # lambda
  31. result = df.assign(A=lambda x: x.A + x.B)
  32. tm.assert_frame_equal(result, expected)
  33. def test_assign_multiple(self):
  34. df = DataFrame([[1, 4], [2, 5], [3, 6]], columns=["A", "B"])
  35. result = df.assign(C=[7, 8, 9], D=df.A, E=lambda x: x.B)
  36. expected = DataFrame(
  37. [[1, 4, 7, 1, 4], [2, 5, 8, 2, 5], [3, 6, 9, 3, 6]], columns=list("ABCDE")
  38. )
  39. tm.assert_frame_equal(result, expected)
  40. def test_assign_order(self):
  41. # GH 9818
  42. df = DataFrame([[1, 2], [3, 4]], columns=["A", "B"])
  43. result = df.assign(D=df.A + df.B, C=df.A - df.B)
  44. expected = DataFrame([[1, 2, 3, -1], [3, 4, 7, -1]], columns=list("ABDC"))
  45. tm.assert_frame_equal(result, expected)
  46. result = df.assign(C=df.A - df.B, D=df.A + df.B)
  47. expected = DataFrame([[1, 2, -1, 3], [3, 4, -1, 7]], columns=list("ABCD"))
  48. tm.assert_frame_equal(result, expected)
  49. def test_assign_bad(self):
  50. df = DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
  51. # non-keyword argument
  52. msg = r"assign\(\) takes 1 positional argument but 2 were given"
  53. with pytest.raises(TypeError, match=msg):
  54. df.assign(lambda x: x.A)
  55. msg = "'DataFrame' object has no attribute 'C'"
  56. with pytest.raises(AttributeError, match=msg):
  57. df.assign(C=df.A, D=df.A + df.C)
  58. def test_assign_dependent(self):
  59. df = DataFrame({"A": [1, 2], "B": [3, 4]})
  60. result = df.assign(C=df.A, D=lambda x: x["A"] + x["C"])
  61. expected = DataFrame([[1, 3, 1, 2], [2, 4, 2, 4]], columns=list("ABCD"))
  62. tm.assert_frame_equal(result, expected)
  63. result = df.assign(C=lambda df: df.A, D=lambda df: df["A"] + df["C"])
  64. expected = DataFrame([[1, 3, 1, 2], [2, 4, 2, 4]], columns=list("ABCD"))
  65. tm.assert_frame_equal(result, expected)