如何根据字符串位置值提取大熊猫中的文本?

时间:2019-08-02 19:34:18

标签: python pandas

考虑这样的数据:

df = pd.DataFrame({'Log': ["Msadr#3 <-CmdS='LinkSelect'", "ErrCommPortOpen [MSADR#4-N]", "a"]})
df['Aux Col'] = df['Log'].str.lower().str.find('msadr') + 6

enter image description here

我想获取“ 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']})

2 个答案:

答案 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
相关问题