Pandas:系列长度不相等的布尔值索引 [英] Pandas: boolean indexing with unequal Series lengths

查看:82
本文介绍了Pandas:系列长度不相等的布尔值索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出两个熊猫系列对象A和Matchs.匹配项包含索引A的子集,并且具有布尔项.等效于逻辑索引的是什么?

Given two pandas series objects A and Matches. Matches contains a subset of the indexes of A and has boolean entries. How does one do the equivalent of logical indexing?

如果Matches与A的长度相同,则可以使用:

If Matches were the same length as A, one could just use:

A[Matches] = 5.*Matches

匹配项少于A的人得到:

With Matches shorter than A one gets:

error: Unalignable boolean Series key provided


按要求绘制插图

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]: 

我正在寻找的结果是:

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

Matches系列的结构是人造的,仅供参考.另外,在我的情况下,行索引显然是非数字的,并且不等于元素值...

The construction of the Matches series is artificial and for illustration only. Also, in my case row indexes are obviously non-numeric and not equal to element values...

推荐答案

好吧,您没有想要的东西,因为对于没有任何内容的系列,int64可能不是dtype.没有一个不是整数.但是您可以接近:

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

>>> 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

之所以起作用,是因为Matches[Matches]选择了Matches正确的元素.

Which works because Matches[Matches] selects the elements of Matches which are true.

这篇关于Pandas:系列长度不相等的布尔值索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆