【问题标题】:Python equivalence of R's match() for indexing用于索引的 R 的 match() 的 Python 等价性
【发布时间】:2017-02-13 15:53:14
【问题描述】:

所以我本质上想使用 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')

在 R 中我们会得到

match(A$C,B$C) = c(7,3)

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

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    这是一个一个班轮

    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】:

      您可以先使用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
      

      【讨论】:

      • 请注意这里的结果是以不同的顺序返回的。在R中,match的输出顺序对应输入:('a', 'b')对应c(7,3),但是这里的答案是先返回b的结果,然后是a。请参阅我的回答,了解尊重订单的单线选项。
      【解决方案3】:

      这给出了所有匹配的索引(使用 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]
      

      【讨论】:

        猜你喜欢
        • 2013-03-29
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        • 2018-01-02
        • 2021-07-09
        • 2020-02-25
        相关资源
        最近更新 更多