2014-02-09 45 views
0

我有两个系列:python熊猫:如何获得在其他系列中具有匹配值的系列值的索引?

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 

...然后得到“真”值的指数为每列

+0

什么是你想要的输出数据结构? – DSM

+0

我没有所需的输出数据结构。我只需要能够在'serie2'中找到'serie1'值的匹配/匹配(索引)。长的答案是:'serie2'属于一个有另一列的数据框(我们称之为'long_name'),并且我想将正确的'long_name'添加到'serie1'。不幸的是'serie1'和'serie2'没有相关的索引长度不一样。 –

+0

当你说*“...然后得到每列”*“的”真“值的索引时,您可能需要布尔矩阵/表格/交叉制表符或匹配索引......或者两者兼而有之。你想如何匹配你的指数?作为多个系列?作为一个字典?等等。 – smci

回答

0

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

还是这个,这可能是不易阅读:serie2.index[(serie2=='A')[0]]

+0

谢谢,但这意味着迭代列(在我的真实情况下接近一百万:/)。是否有更快的解决方案来验证series1中的值在series2中的位置? –

+0

我可以假设'serie1'中的唯一值是'serie2'中唯一值的子集(我认为这应该是真的)。如果是这样,'serie1'中是否会有非常多的唯一值?或者只有少数? –

+0

是的。 'serie1'的唯一值是'serie2'唯一值的子集。问题是'serie1'的某些值可能在'serie2'中有多个匹配项(因此会有多个'long_name' - 如果你愿意,请参阅我对@DSM的解释),我不想放弃信息。 –

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]] 
相关问题