2016-10-05 8 views
3

したがって、forループを使用せずに、Pandasデータフレームを使用してPythonでRのmatch()関数と同等の機能を実装します。索引付けのためのRのmatch()とPythonの同義語

R match()は、最初の引数の(2番目の)一致の位置のベクトルを返します。

のは、私は両方の我々はPythonで同等の方法は何

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

になるだろうRで

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

列Cを含んでいる2 DF AとB、そのことを言ってみましょう値をループする必要がない、パンダデータフレームの列の場合。

答えて

2

最初にdrop_duplicatesを使用し、次にboolean indexingisinまたはmergeとすることができます。

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] 
関連する問題