所以我本质上想在Python中实现R的match()函数的等价物,使用Pandas Dataframe -而不使用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数据框中的列有一个等效的方法,它不需要循环遍历值。
4条答案
按热度按时间ebdffaop1#
下面是一个 * 一行 *:
B.reset_index().groupby('C')['index'].first()[A.C].values
这个解决方案以与输入
A
相同的顺序返回结果,就像match
在R中所做的那样。完整示例:
***编辑(2023-04-12):***在pandas的新版本中,
.loc
匹配所有符合条件的行。因此,以前的解决方案(B.reset_index().set_index('c').loc[A.c, 'index'].values
)将返回所有匹配,而不仅仅是第一个匹配。3qpi33ja2#
您可以先使用
drop_duplicates
,然后使用boolean indexing
和isin
或merge
。Python从
0
开始计数,因此对于相同的输出添加1
。4urapxun3#
这给出了所有匹配的索引(使用python的基于0的索引):
q43xntqr4#
下面是一个包含各种方法的实现。如果不使用C或C++,最快的方法似乎是
datatable
:测试代码:
时间以秒为单位:
{'datatable': 1.55, 'pandas': 8.01, 'numpy': 14.91, 'hashing': 6.04}
但最快的仍然比R的
match
慢:1.05s
R一定使用了一些类似于基数排序的哈希技术。