如何结合 pandas 的 startswith 和 IF

How to combine startswith and IF for pandas

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

这是兴趣栏 df 'PartNumber' 中的内容示例(GLO、GLOA、GLO1、GLOA2、GLO9 等)共同点是 "GLO" 我想要标签待补充 "GLO Series".

此代码成功识别具有起始条件的行

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') 根据这个,一个值将被放置在一个集合列中,结果是 ('Glo series', 'Flo series', 'Mow series')

假设 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     ?

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

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. 定义一个Series,索引由"wanted"个前缀和相应的组成 将名称分组为值:

    search = pd.Series(['Glo Series', 'Flo Series', 'Mow  Series'],
        index=['GLO', 'FLO', 'MOW'])
    
  2. 定义一个函数以从零件号获取零件系列名称:

    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'
    

    注意,如果在循环中没有找到匹配项,最后一条指令 returns 'Alphabet start''Alphabet end'(如您要求的那样 在你的评论中)。

  3. 生成结果用结果更新TAG_2(就地) 上述功能的应用:

    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     ?

经过上面的updata结果是:

      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

如果您有更多 "wanted" 个群组,请相应地更改 search 变量。