如何将startswith和IF结合起来用于熊猫

我正在尝试做两件事-第一是在df中使用startswith来识别哪些行包含条件,第二是向列添加特定的TAG。我已经能够正确但分开地完成这两项工作-但合并失败。

这是兴趣列df'PartNumber'中的内容的一个示例(GLO,GLOA,GLO1,GLOA2,GLO9等),共同点是“ GLO”,我希望标签添加“ GLO系列”。

此代码可以成功标识具有起始条件的行

search = 'GLO'
search_series = df['PartNumber'].str.startswith(search, na= False)
df[search_series] 

这段代码可以成功标识具有特定条件的行-我知道这是因为'=='。面临的挑战是我必须调出特定的部分,这是我所不知道的所有值,因此我尝试执行“ startswith”

df.loc[(df['PartNumber']== 'GLOA2'),'TAG_2']='Glo Series'
print (df)

我试图将两者都无效。

我试图实现一种一旦完成的“ If this / then that”的几种情况,总结如下:

df [PartNumber]用于根据起始字符('GLO','FL0','MOW')来设置条件的ID 取决于此值,然后将一个值放置在设置列中,从而得出(“ Glo系列”,“ Flo系列”,“ Mow系列”)

评论
  • dquis
    dquis 回复

    假定TAG_2列最初包含其他一些值 (我用?标记了它们):

          ind PartNumber  Val TAG_2
    0  110101        ABC   20     ?
    1  110102        GLO   22     ?
    2  110103       GLO1   24     ?
    3  110104       GLO2   26     ?
    4  110105        XYZ   28     ?
    

    一次性完成任务(假设您将搜索设置为 想要的值),您可以运行:

    df.TAG_2.mask(df['PartNumber'].str.startswith(search, na=False), 'Glo Series', inplace=True)
    

    结果是:

          ind PartNumber  Val       TAG_2
    0  110101        ABC   20           ?
    1  110102        GLO   22  Glo Series
    2  110103       GLO1   24  Glo Series
    3  110104       GLO2   26  Glo Series
    4  110105        XYZ   28           ?
    

    第2部分

    要检测多个组前缀并将TAG_2设置为对应的 组名,采取不同的方法。

    1. Define a Series with index composed of "wanted" prefixes and corresponding group names as values:

      search = pd.Series(['Glo Series', 'Flo Series', 'Mow  Series'],
          index=['GLO', 'FLO', 'MOW'])
      
    2. Define a function to get the part series name from a part number:

      def getSer(PartNo):
          for idx, val in search.iteritems():
              if PartNo.startswith(idx):
                  return val
          return 'Alphabet start' if PartNo < search.index.min() else 'Alphabet end'
      

      Note that if no match has been found in the loop, the last instruction returns either 'Alphabet start' or 'Alphabet end' (as you asked for in your comment).

    3. Generate the result updating TAG_2 (in place) with the result of application of the above function:

      df.TAG_2.update(df.PartNumber.apply(getSer))
      

    这次,为了测试此代码,我使用了一个包含以下内容的DataFrame:

          ind PartNumber  Val TAG_2
    0  110101      ABC30   20     ?
    1  110102      FLO34   22     ?
    2  110103      GLO10   24     ?
    3  110104      GLO22   26     ?
    4  110105      XYZ26   28     ?
    5  110105      MOW55   30     ?
    6  110105      XYZ99   28     ?
    

    经过上述更新后的结果是:

          ind PartNumber  Val           TAG_2
    0  110101      ABC30   20  Alphabet start
    1  110102      FLO34   22      Flo Series
    2  110103      GLO10   24      Glo Series
    3  110104      GLO22   26      Glo Series
    4  110105      XYZ26   28    Alphabet end
    5  110105      MOW55   30     Mow  Series
    6  110105      XYZ99   28    Alphabet end
    

    如果您有更多“想要的”组,请相应地更改搜索变量。