考虑这样的数据:
df = pd.DataFrame({'Log': ["Msadr#3 <-CmdS='LinkSelect'", "ErrCommPortOpen [MSADR#4-N]", "a"]})
df['Aux Col'] = df['Log'].str.lower().str.find('msadr') + 6
我想获取“ msadr”之后的数字,它是str.find
位置之后的6个字符。如果不存在,str.find
将返回-1,并且'Aux Col'上的值将为5。
因此,对于df ['Aux Col']不是5的情况,我尝试在df ['Log']中获取“ df ['Aux'] th个字符”。
但是,当我尝试时:
df.loc[df['Aux Col'] != 5, "#"] = df['Log'].str[df['Aux Col']]
它返回以下错误消息:
ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
为什么模棱两可,我该如何解决?
预期结果是
df = pd.DataFrame({'Log': ["Msadr#3 <-CmdS='LinkSelect'", "ErrCommPortOpen [MSADR#4-N]", "a"], '#': ['3','4','NaN']})
答案 0 :(得分:3)
好像
df['Log'].str.lower().str.extract('(?:[msadr#](\d+))')
Out[139]:
0
0 3
1 4
2 NaN
修复代码
[x[y:y+1] for x ,y in zip(df['Log'],df['Aux Col'])]
答案 1 :(得分:1)
确切的预期结果:
df['#'] = df['Log'].str.extract(r'(?<=msadr#)(\d+)', flags=re.I, expand=False)
In [27]: df
Out[27]:
Log #
0 Msadr#3 <-CmdS='LinkSelect' 3
1 ErrCommPortOpen [MSADR#4-N] 4
2 a NaN