Pandas: logical indexing with unequal row lengths

For two pandas A series objects and matches. Matches contain a subset of indices A and have logical entries. How to make the equivalent of logical indexing?

If the matches were the same length as A, then one could simply use:

A[Matches] = 5.*Matches 

In the case of matches less than A, it turns out:

 error: Unalignable boolean Series key provided 

Edit 1: Illustration on request

 In [15]: A = pd.Series(range(10)) In [16]: A Out[16]: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 dtype: int64 In [17]: Matches = (A<3)[:5] In [18]: Matches Out[18]: 0 True 1 True 2 True 3 False 4 False dtype: bool In [19]: A[Matches] = None --------------------------------------------------------------------------- IndexingError Traceback (most recent call last) <ipython-input-19-7a04f32ce860> in <module>() ----> 1 A[Matches] = None C:\Anaconda\lib\site-packages\pandas\core\series.py in __setitem__(self, key, value) 631 632 if _is_bool_indexer(key): --> 633 key = _check_bool_indexer(self.index, key) 634 try: 635 self.where(~key, value, inplace=True) C:\Anaconda\lib\site-packages\pandas\core\indexing.py in _check_bool_indexer(ax, key) 1379 mask = com.isnull(result.values) 1380 if mask.any(): -> 1381 raise IndexingError('Unalignable boolean Series key provided') 1382 1383 result = result.astype(bool).values IndexingError: Unalignable boolean Series key provided In [20]: 

As a result, I am looking for:

 In [16]: A Out[16]: 0 None 1 None 2 None 3 3 4 4 5 5 6 6 7 7 8 8 9 9 dtype: int64 

The design of the Matches series is artificial and illustrative only. Also, in my case, the row indices are obviously not numeric and are not equal to the values ​​of the elements ...

+6
source share
1 answer

Well, you cannot have what you want, because int64 not a possible dtype for a series containing None. None is not an integer. But you can get closer:

 >>> A = pd.Series(range(10)) >>> Matches = (A<3)[:5] >>> A[Matches[Matches].index] = None >>> A 0 None 1 None 2 None 3 3 4 4 5 5 6 6 7 7 8 8 9 9 dtype: object 

Which works because Matches[Matches] selects Matches elements that are true.

+4
source

All Articles