如何结合 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对应
组名,另辟蹊径。
定义一个Series,索引由"wanted"个前缀和相应的组成
将名称分组为值:
search = pd.Series(['Glo Series', 'Flo Series', 'Mow Series'],
index=['GLO', 'FLO', 'MOW'])
定义一个函数以从零件号获取零件系列名称:
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'(如您要求的那样
在你的评论中)。
生成结果用结果更新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 变量。
我正在尝试做两件事 - 第一个是在 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对应 组名,另辟蹊径。
定义一个Series,索引由"wanted"个前缀和相应的组成 将名称分组为值:
search = pd.Series(['Glo Series', 'Flo Series', 'Mow Series'], index=['GLO', 'FLO', 'MOW'])
定义一个函数以从零件号获取零件系列名称:
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'(如您要求的那样 在你的评论中)。
生成结果用结果更新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 变量。