用于索引的R的match()的Python等价

时间:2016-10-05 09:15:47

标签: python r pandas indexing match

所以我基本上想要在Python中使用Pandas数据帧实现R的match()函数的等价物 - 而不使用for循环。

在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中对于pandas数据帧中的列的等效方法是什么,不需要循环遍历值。

3 个答案:

答案 0 :(得分:3)

您可以先使用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 :(得分:3)

这是一个一个班轮

B.reset_index().set_index('c').loc[A.c, 'index'].values

此解决方案以与输入A相同的顺序返回结果,就像match在R中所做的那样,因此它比@jezrael的答案更好,因为


完整示例:

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

B.reset_index().set_index('c').loc[A.c, 'index'].values
Output array([6, 2])

答案 2 :(得分: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]