python pandas:如何从其他系列中具有匹配值的系列中获取值的索引?

时间:2014-02-09 21:17:58

标签: python pandas series

我有这两个系列:

In [48]: serie1
Out[48]: 
0    A
1    B
2    C
3    A
4    D

In [49]: serie2
Out[49]: 
0    X
1    Y
2    A
3    Z
4    A
5    D
dtype: object

对于serie1中的每个值,我想从serie2获取索引/索引。 如果没有迭代值,这可能吗? 一个可能的解决方案是建立一个或多或少像这样的数据框架:

       A      B      C      D
X    False  False  False  False                 
Y    False  False  False  False
A    True   False  False  False
Z    False  False  False  False
A    True   False  False  False
D    False  False  False  True

...然后获取每列值的索引

2 个答案:

答案 0 :(得分:0)

我认为serie2.index[(array(serie2)=='A').flatten()]可能有用。 'A'是您要为其查找索引的值。

或者这可能不太可读:serie2.index[(serie2=='A')[0]]

答案 1 :(得分:0)

1)对于布尔匹配表:如果你想要交叉制表(只显示唯一值,不重复),然后将其转换为布尔值:

serie1 = pd.Series(['A','B','C','A','D'])
serie2 = pd.Series(['X','Y','A','Z','A','D'])

pd.crosstab(serie2,serie1) > 0 

col_0      A      B      C      D
row_0                            
A      False  False   True   True
X       True  False  False  False
Y      False   True  False  False
Z       True  False  False  False

(请注意,行索引会按值自动排序,因此不是serie1中值显示的顺序。您可以通过使用.reorder_levels(...)来覆盖行

2)至于匹配指数,将它们作为数组的词典......

serie2.groupby(serie1).indices

{'A': array([0, 3]), 'C': array([2]), 'B': array([1]), 'D': array([4])}

# ... or as a list of arrays...
serie2.groupby(serie1).indices.values()

[array([0, 3]), array([2]), array([1]), array([4])]

# Here are alternatives with list comprehensions which are probably less efficient than `Series.groupby()` 
>>> [ np.flatnonzero(serie2.apply(lambda i2: i2==i1)) for i1 in serie1 ]
[array([2, 4]), array([], dtype=int64), array([], dtype=int64), array([2, 4]), array([5])]

>>> [ np.flatnonzero(serie2.apply(lambda i2: i2==i1)).tolist() for i1 in serie1 ]
[[2, 4], [], [], [2, 4], [5]]