2016-10-05 31 views
3

因此,我基本上想要在Python中使用Pandas数据框实现等效的R的match()函数 - 而不使用for-loop。R的匹配python等价()索引

在R match()返回第二个参数的第一个参数的(第一个)匹配位置的向量。

比方说,我有两个DF A和其中的B,既包括列C.凡

A$C = c('a','b') 
B$C = c('c','c','b','b','c','b','a','a') 

在该R,我们会得到

match(A$C,B$C) = c(7,3) 

什么是Python中的等效方法对于熊猫数据框中的列,不需要循环访问值。

回答

2

您可以先用drop_duplicates,然后用boolean indexingisinmerge

Python的计数来自0,所以对于相同的输出添加1

A = pd.DataFrame({'c':['a','b']}) 
B = pd.DataFrame({'c':['c','c','b','b','c','b','a','a']}) 


B = B.drop_duplicates('c') 
print (B) 
    c 
0 c 
2 b 
6 a 

print (B[B.c.isin(A.c)]) 
    c 
2 b 
6 a 

print (B[B.c.isin(A.c)].index) 
Int64Index([2, 6], dtype='int64') 

print (pd.merge(B.reset_index(), A)) 
    index c 
0  2 b 
1  6 a 

print (pd.merge(B.reset_index(), A)['index']) 
0 2 
1 6 
Name: index, dtype: int64 
1

这给所有匹配的指数(与Python的基于0的索引):

import pandas as pd 

df1 = pd.DataFrame({'C': ['a','b']}) 
print df1 

    C 
0 a 
1 b 

df2 = pd.DataFrame({'C': ['c','c','b','b','c','b','a','a']}) 
print df2 

    C 
0 c 
1 c 
2 b 
3 b 
4 c 
5 b 
6 a 
7 a 

match = df2['C'].isin(df1['C']) 
print [i for i in range(match.shape[0]) if match[i]] 

#[2, 3, 5, 6, 7]