PageRenderTime 33ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/pandas/tests/indexing/test_callable.py

https://github.com/neurodebian/pandas
Python | 267 lines | 184 code | 64 blank | 19 comment | 0 complexity | efd1e3443d66acb1bab4a9781930954a MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. # pylint: disable-msg=W0612,E1101
  3. import numpy as np
  4. import pandas as pd
  5. import pandas.util.testing as tm
  6. class TestIndexingCallable(object):
  7. def test_frame_loc_ix_callable(self):
  8. # GH 11485
  9. df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': list('aabb'),
  10. 'C': [1, 2, 3, 4]})
  11. # iloc cannot use boolean Series (see GH3635)
  12. # return bool indexer
  13. res = df.loc[lambda x: x.A > 2]
  14. tm.assert_frame_equal(res, df.loc[df.A > 2])
  15. res = df.loc[lambda x: x.A > 2]
  16. tm.assert_frame_equal(res, df.loc[df.A > 2])
  17. res = df.loc[lambda x: x.A > 2, ]
  18. tm.assert_frame_equal(res, df.loc[df.A > 2, ])
  19. res = df.loc[lambda x: x.A > 2, ]
  20. tm.assert_frame_equal(res, df.loc[df.A > 2, ])
  21. res = df.loc[lambda x: x.B == 'b', :]
  22. tm.assert_frame_equal(res, df.loc[df.B == 'b', :])
  23. res = df.loc[lambda x: x.B == 'b', :]
  24. tm.assert_frame_equal(res, df.loc[df.B == 'b', :])
  25. res = df.loc[lambda x: x.A > 2, lambda x: x.columns == 'B']
  26. tm.assert_frame_equal(res, df.loc[df.A > 2, [False, True, False]])
  27. res = df.loc[lambda x: x.A > 2, lambda x: x.columns == 'B']
  28. tm.assert_frame_equal(res, df.loc[df.A > 2, [False, True, False]])
  29. res = df.loc[lambda x: x.A > 2, lambda x: 'B']
  30. tm.assert_series_equal(res, df.loc[df.A > 2, 'B'])
  31. res = df.loc[lambda x: x.A > 2, lambda x: 'B']
  32. tm.assert_series_equal(res, df.loc[df.A > 2, 'B'])
  33. res = df.loc[lambda x: x.A > 2, lambda x: ['A', 'B']]
  34. tm.assert_frame_equal(res, df.loc[df.A > 2, ['A', 'B']])
  35. res = df.loc[lambda x: x.A > 2, lambda x: ['A', 'B']]
  36. tm.assert_frame_equal(res, df.loc[df.A > 2, ['A', 'B']])
  37. res = df.loc[lambda x: x.A == 2, lambda x: ['A', 'B']]
  38. tm.assert_frame_equal(res, df.loc[df.A == 2, ['A', 'B']])
  39. res = df.loc[lambda x: x.A == 2, lambda x: ['A', 'B']]
  40. tm.assert_frame_equal(res, df.loc[df.A == 2, ['A', 'B']])
  41. # scalar
  42. res = df.loc[lambda x: 1, lambda x: 'A']
  43. assert res == df.loc[1, 'A']
  44. res = df.loc[lambda x: 1, lambda x: 'A']
  45. assert res == df.loc[1, 'A']
  46. def test_frame_loc_ix_callable_mixture(self):
  47. # GH 11485
  48. df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': list('aabb'),
  49. 'C': [1, 2, 3, 4]})
  50. res = df.loc[lambda x: x.A > 2, ['A', 'B']]
  51. tm.assert_frame_equal(res, df.loc[df.A > 2, ['A', 'B']])
  52. res = df.loc[lambda x: x.A > 2, ['A', 'B']]
  53. tm.assert_frame_equal(res, df.loc[df.A > 2, ['A', 'B']])
  54. res = df.loc[[2, 3], lambda x: ['A', 'B']]
  55. tm.assert_frame_equal(res, df.loc[[2, 3], ['A', 'B']])
  56. res = df.loc[[2, 3], lambda x: ['A', 'B']]
  57. tm.assert_frame_equal(res, df.loc[[2, 3], ['A', 'B']])
  58. res = df.loc[3, lambda x: ['A', 'B']]
  59. tm.assert_series_equal(res, df.loc[3, ['A', 'B']])
  60. res = df.loc[3, lambda x: ['A', 'B']]
  61. tm.assert_series_equal(res, df.loc[3, ['A', 'B']])
  62. def test_frame_loc_callable(self):
  63. # GH 11485
  64. df = pd.DataFrame({'X': [1, 2, 3, 4],
  65. 'Y': list('aabb')},
  66. index=list('ABCD'))
  67. # return label
  68. res = df.loc[lambda x: ['A', 'C']]
  69. tm.assert_frame_equal(res, df.loc[['A', 'C']])
  70. res = df.loc[lambda x: ['A', 'C'], ]
  71. tm.assert_frame_equal(res, df.loc[['A', 'C'], ])
  72. res = df.loc[lambda x: ['A', 'C'], :]
  73. tm.assert_frame_equal(res, df.loc[['A', 'C'], :])
  74. res = df.loc[lambda x: ['A', 'C'], lambda x: 'X']
  75. tm.assert_series_equal(res, df.loc[['A', 'C'], 'X'])
  76. res = df.loc[lambda x: ['A', 'C'], lambda x: ['X']]
  77. tm.assert_frame_equal(res, df.loc[['A', 'C'], ['X']])
  78. # mixture
  79. res = df.loc[['A', 'C'], lambda x: 'X']
  80. tm.assert_series_equal(res, df.loc[['A', 'C'], 'X'])
  81. res = df.loc[['A', 'C'], lambda x: ['X']]
  82. tm.assert_frame_equal(res, df.loc[['A', 'C'], ['X']])
  83. res = df.loc[lambda x: ['A', 'C'], 'X']
  84. tm.assert_series_equal(res, df.loc[['A', 'C'], 'X'])
  85. res = df.loc[lambda x: ['A', 'C'], ['X']]
  86. tm.assert_frame_equal(res, df.loc[['A', 'C'], ['X']])
  87. def test_frame_loc_callable_setitem(self):
  88. # GH 11485
  89. df = pd.DataFrame({'X': [1, 2, 3, 4],
  90. 'Y': list('aabb')},
  91. index=list('ABCD'))
  92. # return label
  93. res = df.copy()
  94. res.loc[lambda x: ['A', 'C']] = -20
  95. exp = df.copy()
  96. exp.loc[['A', 'C']] = -20
  97. tm.assert_frame_equal(res, exp)
  98. res = df.copy()
  99. res.loc[lambda x: ['A', 'C'], :] = 20
  100. exp = df.copy()
  101. exp.loc[['A', 'C'], :] = 20
  102. tm.assert_frame_equal(res, exp)
  103. res = df.copy()
  104. res.loc[lambda x: ['A', 'C'], lambda x: 'X'] = -1
  105. exp = df.copy()
  106. exp.loc[['A', 'C'], 'X'] = -1
  107. tm.assert_frame_equal(res, exp)
  108. res = df.copy()
  109. res.loc[lambda x: ['A', 'C'], lambda x: ['X']] = [5, 10]
  110. exp = df.copy()
  111. exp.loc[['A', 'C'], ['X']] = [5, 10]
  112. tm.assert_frame_equal(res, exp)
  113. # mixture
  114. res = df.copy()
  115. res.loc[['A', 'C'], lambda x: 'X'] = np.array([-1, -2])
  116. exp = df.copy()
  117. exp.loc[['A', 'C'], 'X'] = np.array([-1, -2])
  118. tm.assert_frame_equal(res, exp)
  119. res = df.copy()
  120. res.loc[['A', 'C'], lambda x: ['X']] = 10
  121. exp = df.copy()
  122. exp.loc[['A', 'C'], ['X']] = 10
  123. tm.assert_frame_equal(res, exp)
  124. res = df.copy()
  125. res.loc[lambda x: ['A', 'C'], 'X'] = -2
  126. exp = df.copy()
  127. exp.loc[['A', 'C'], 'X'] = -2
  128. tm.assert_frame_equal(res, exp)
  129. res = df.copy()
  130. res.loc[lambda x: ['A', 'C'], ['X']] = -4
  131. exp = df.copy()
  132. exp.loc[['A', 'C'], ['X']] = -4
  133. tm.assert_frame_equal(res, exp)
  134. def test_frame_iloc_callable(self):
  135. # GH 11485
  136. df = pd.DataFrame({'X': [1, 2, 3, 4],
  137. 'Y': list('aabb')},
  138. index=list('ABCD'))
  139. # return location
  140. res = df.iloc[lambda x: [1, 3]]
  141. tm.assert_frame_equal(res, df.iloc[[1, 3]])
  142. res = df.iloc[lambda x: [1, 3], :]
  143. tm.assert_frame_equal(res, df.iloc[[1, 3], :])
  144. res = df.iloc[lambda x: [1, 3], lambda x: 0]
  145. tm.assert_series_equal(res, df.iloc[[1, 3], 0])
  146. res = df.iloc[lambda x: [1, 3], lambda x: [0]]
  147. tm.assert_frame_equal(res, df.iloc[[1, 3], [0]])
  148. # mixture
  149. res = df.iloc[[1, 3], lambda x: 0]
  150. tm.assert_series_equal(res, df.iloc[[1, 3], 0])
  151. res = df.iloc[[1, 3], lambda x: [0]]
  152. tm.assert_frame_equal(res, df.iloc[[1, 3], [0]])
  153. res = df.iloc[lambda x: [1, 3], 0]
  154. tm.assert_series_equal(res, df.iloc[[1, 3], 0])
  155. res = df.iloc[lambda x: [1, 3], [0]]
  156. tm.assert_frame_equal(res, df.iloc[[1, 3], [0]])
  157. def test_frame_iloc_callable_setitem(self):
  158. # GH 11485
  159. df = pd.DataFrame({'X': [1, 2, 3, 4],
  160. 'Y': list('aabb')},
  161. index=list('ABCD'))
  162. # return location
  163. res = df.copy()
  164. res.iloc[lambda x: [1, 3]] = 0
  165. exp = df.copy()
  166. exp.iloc[[1, 3]] = 0
  167. tm.assert_frame_equal(res, exp)
  168. res = df.copy()
  169. res.iloc[lambda x: [1, 3], :] = -1
  170. exp = df.copy()
  171. exp.iloc[[1, 3], :] = -1
  172. tm.assert_frame_equal(res, exp)
  173. res = df.copy()
  174. res.iloc[lambda x: [1, 3], lambda x: 0] = 5
  175. exp = df.copy()
  176. exp.iloc[[1, 3], 0] = 5
  177. tm.assert_frame_equal(res, exp)
  178. res = df.copy()
  179. res.iloc[lambda x: [1, 3], lambda x: [0]] = 25
  180. exp = df.copy()
  181. exp.iloc[[1, 3], [0]] = 25
  182. tm.assert_frame_equal(res, exp)
  183. # mixture
  184. res = df.copy()
  185. res.iloc[[1, 3], lambda x: 0] = -3
  186. exp = df.copy()
  187. exp.iloc[[1, 3], 0] = -3
  188. tm.assert_frame_equal(res, exp)
  189. res = df.copy()
  190. res.iloc[[1, 3], lambda x: [0]] = -5
  191. exp = df.copy()
  192. exp.iloc[[1, 3], [0]] = -5
  193. tm.assert_frame_equal(res, exp)
  194. res = df.copy()
  195. res.iloc[lambda x: [1, 3], 0] = 10
  196. exp = df.copy()
  197. exp.iloc[[1, 3], 0] = 10
  198. tm.assert_frame_equal(res, exp)
  199. res = df.copy()
  200. res.iloc[lambda x: [1, 3], [0]] = [-5, -5]
  201. exp = df.copy()
  202. exp.iloc[[1, 3], [0]] = [-5, -5]
  203. tm.assert_frame_equal(res, exp)