如何从“熊猫”列中提取特定信息?

时间:2020-06-11 11:27:55

标签: python regex pandas

这是posdf

      tradingsymbol
0     XYZ2061820500PE
1     XYZ20JUN21000PE
2     ABC20JUN100CE
3    ABC20JUN102.5PE
4     ABC20JUN92.5PE
4     XYZ20JUNFUT

我这样做是为了将ABCXYZ提取到列中:

posdf['symbol'] = posdf['tradingsymbol'].str.extract('^(\D+)', expand=True)

我无法弄清楚如何以通用方式提取以下列:

     strike    type   Expiry
0    20500     PE     20618
1    21000     PE     20JUN
2    100       CE     20JUN
3    102.5     PE     20JUN
4    92.5      PE     20JUN
4    NA        FUT    20JUN

编辑

type最少2个字符,最多3个字符。 Expiry始终为5个字符。可能采用以下形式:20O1820N1820D18

第二次编辑

根据萨米的评论添加其中type可以为3个字符的行。

3 个答案:

答案 0 :(得分:4)

以给定的regex模式使用Series.str.extract

df1 = df['tradingsymbol'].str.extract(
    r'(?P<expiry>\d{5}|\d{2}\w{3})(?P<strike>\d+(?:\.\d+)?)?(?P<type>\w+)')
df1 = df1[['strike', 'type', 'expiry']]

结果:

# print(df1)
  strike type expiry

0  20500   PE  20618
1  21000   PE  20JUN
2    100   CE  20JUN
3  102.5   PE  20JUN
4   92.5   PE  20JUN
4    NaN  FUT  20JUN

您可以测试正则表达式here

答案 1 :(得分:3)

如果“罢工”始终为数字,则可以执行以下操作:

posdf[['Symbol','Expiry','Strike','Type']] = posdf['tradingsymbol'].str.extract('^(\D+)(.{5})([0-9.]*)([a-zA-Z]{2,3})', expand=True)

结果:

     tradingsymbol Symbol Expiry Strike Type
0  XYZ2061820500PE    XYZ  20618  20500   PE
1  XYZ20JUN21000PE    XYZ  20JUN  21000   PE
2    ABC20JUN100CE    ABC  20JUN    100   CE
3  ABC20JUN102.5PE    ABC  20JUN  102.5   PE
4   ABC20JUN92.5PE    ABC  20JUN   92.5   PE
4      XYZ20JUNFUT    XYZ  20JUN         FUT

答案 2 :(得分:2)

一点点黑客:

res = (df.assign(Expiry = df.tradingsymbol.str[3:8],
                 type = df.tradingsymbol.str[8:].str.split("([a-zA-Z]+)").str[1],
                 strike = df.tradingsymbol.str[8:].str.split("[a-zA-Z]+").str[0],
                )
      )

res


   tradingsymbol    Expiry  type    strike
0   XYZ2061820500PE 20618   PE      20500
1   XYZ20JUN21000PE 20JUN   PE      21000
2   ABC20JUN100CE   20JUN   CE      100
3   ABC20JUN102.5PE 20JUN   PE      102.5
4   ABC20JUN92.5PE  20JUN   PE      92.5
4   XYZ20JUNFUT     20JUN   FUT 
相关问题