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

lei*_*erl 6 python indexing pandas

所以我本质上想使用 Pandas 数据帧在 Python 中实现 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')
Run Code Online (Sandbox Code Playgroud)

在 R 中,我们会得到

match(A$C,B$C) = c(7,3)
Run Code Online (Sandbox Code Playgroud)

什么是 Python 中 Pandas 数据框中列的等效方法,不需要循环遍历值。

tot*_*ico 5

这是一个单班轮

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
Run Code Online (Sandbox Code Playgroud)
Output array([6, 2])
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 4

您可以先使用drop_duplicates,然后boolean indexing使用isinormerge使用。

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')
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此处的结果以不同的顺序返回。在`R`中,`match`的输出顺序对应于输入:`('a', 'b')`对应于`c(7,3)`,但是这里的答案返回的是`的结果首先是 b`,然后是 `a`。请参阅我的答案,了解尊重顺序的单行选项。 (2认同)