簡體   English   中英

用於索引的 R 的 match() 的 Python 等價

[英]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 indexingisinmerge

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM