[英]Python equivalence of R's match() for indexing
所以我本质上想在 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 数据帧中的列的等效方法,不需要循环遍历值。
这是一个单班轮:
B.reset_index().set_index('c').loc[Ac, 'index'].values
此解决方案以与输入A
相同的顺序返回结果,就像match
在 R match
所做的那样,因此它比@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])
你可以先用drop_duplicates
,然后boolean indexing
与isin
或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
这给出了所有匹配的索引(使用 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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.