【问题标题】:Pandas Match Column Value to Multiple Columns in Same DataframePandas 将列值匹配到同一数据框中的多个列
【发布时间】:2020-10-07 19:39:04
【问题描述】:

我有一个包含数千列的 Pandas 数据框。 Pandas Dataframe 的 sn-p 通过以下方式表示:

    import numpy as np
    import pandas as pd
    DataFrame1=pd.DataFrame([ ['A1X1' , 'J1', 'Q4', 'ND', 'J1'],
                              ['A1X2' , 'X1', '01', 'Q2', 'JK'],
                              ['A1X3' , 'R6', 'R6', '01', 'A5'],
                              ['A1X4' , 'J1', 'R6', 'A5', 'B6']],
                            columns=['ID', 'SearchValue', 'Check 1', 'Check 2', 'Check 60000'])
    DataFrame1.head(4)

我试图简明扼要地确定“SearchValue”是否在“Check1”、“Check2”以及通过“Check 60000”之前的所有其他列中,如果确实存在,则在新的“FinalResult”中返回“SearchValue” ' 列,当 false 时默认为 'XX'。

我知道我可以使用类似下面的代码来完成这项任务,但我需要编写代码 60,000 次才能覆盖所有列。考虑到实际 DataFrame 中存在的其他“SearchValue”列的数量,这可能会非常迅速地将程序推入数百万行代码,这简直是不可接受的。有没有更好的方法来做到这一点?

    Condition=[
               DataFrame1['SearchValue'] .eq (DataFrame1 [ 'Check 1' ]) 
               | DataFrame1['SearchValue'] .eq (DataFrame1 [ 'Check 2' ]) 
               | DataFrame1['SearchValue'] .eq (DataFrame1 [ 'Check 60000' ]) 
              ]
    Choice=[ 
            DataFrame1['SearchValue']
           ]
    DataFrame1['FinalResult']=numpy.select(Condition,Choice,default='XX')
         
    DataFrame1.head(4)

提前致谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    # create a mask using isin and any
    mask = DataFrame1[DataFrame1.columns[2:]].isin(DataFrame1['SearchValue']).any(1)
    # use numpy.where to assign values
    DataFrame1['FinalResult'] = np.where(mask, DataFrame1['SearchValue'], 'XX')
    
         ID SearchValue Check 1 Check 2 Check 60000 FinalResult
    0  A1X1          J1      Q4      ND          J1          J1
    1  A1X2          X1      01      Q2          JK          XX
    2  A1X3          R6      R6      01          A5          R6
    3  A1X4          J1      R6      A5          B6          XX
    

    【讨论】:

    • 我不确定isin 是否是一个有效的选择。
    • 难以置信。我花了很多时间试图弄清楚这一点,而您只是立即以一种完美的简洁方式弄清楚了。谢谢@It_is_Chris!!
    • @QuangHoang “只有在所有标签都匹配的情况下,结果才会在某个位置为真。如果值是系列,那就是索引,”这应该适用于这种情况,因为 OP 想要比较行明智的。有什么我想念或没有想到的吗?
    • 我也明白 op 想要逐行搜索。如果将第一行搜索值更改为 J2,会发生什么情况?
    • @QuangHoang 当我将索引 0 的 SearchValue 更改为 J2 时,我得到了正确的结果:array(['XX', 'XX', 'R6', 'XX'], dtype=object)
    【解决方案2】:

    我会进入 numpy 世界并进行比较:

    box = df.to_numpy()
    
    box
    
    
    array([['A1X1', 'J1', 'Q4', 'ND', 'J1'],
           ['A1X2', 'X1', '01', 'Q2', 'JK'],
           ['A1X3', 'R6', 'R6', '01', 'A5'],
           ['A1X4', 'J1', 'R6', 'A5', 'B6']], dtype=object)
    
    compare = box[:, 1, np.newaxis] == box[:, 2:]
    

    现在分配numpy where

    df['Final Result'] = np.where(np.sum(compare, axis=1), box[:, 1], "XX")
    
    
        ID  SearchValue Check 1 Check 2 Check 60000 Final Result
    0   A1X1    J1        Q4      ND      J1           J1
    1   A1X2    X1        01      Q2      JK           XX
    2   A1X3    R6        R6      01      A5           R6
    3   A1X4    J1        R6      A5      B6           XX
    

    这个link 很有帮助。

    【讨论】:

      【解决方案3】:

      您要搜索每一行中的值:

      mask = DataFrame1.filter(like='Check').eq(DataFrame1['SearchValue'], axis=0).any(1)
      
      DataFrame1['FinalResult'] = DataFrame1['SerchValue'].where(mask, 'XX')
      

      输出:

           ID SearchValue Check 1 Check 2 Check 60000 FinalResult
      0  A1X1          J1      Q4      ND          J1          J1
      1  A1X2          X1      01      Q2          JK          XX
      2  A1X3          R6      R6      01          A5          R6
      3  A1X4          J1      R6      A5          B6          XX
      

      【讨论】:

      • 这也很完美!真的很喜欢 .eq 的 .filter 加法。
      • 我使用不同的值创建了 DataFrame1,并获得了相同的结果。当我阅读您的两个 cmets 时,我将继续对其进行测试,如果我发现您的答案在技术上更正确,我会将其固定。非常感谢您的帮助!
      • @PythonPandaBear 忘了我说的话。克里斯的回答当然是有效的。
      • 太棒了!你和@It_is_Chris 教我的 .where 和 .isin 的应用比任何文档或其他资源都多。非常感谢你们的及时和知识渊博的回复:)
      猜你喜欢
      • 2019-01-22
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2015-08-11
      • 2022-12-10
      • 2019-01-23
      • 2019-01-20
      • 2017-02-10
      相关资源
      最近更新 更多