【问题标题】:Extract columns from string从字符串中提取列
【发布时间】:2021-11-07 00:09:03
【问题描述】:

我有一个包含以下字符串的 pandas df 列:

0    Future(conId=462009617, symbol='CGB', lastTradeDateOrContractMonth='20211220', multiplier='1000', currency='CAD', localSymbol='CGBZ21', tradingClass='CGB')
1    Stock(conId=80268543, symbol='IJPA', exchange='AEB', currency='EUR', localSymbol='IJPA', tradingClass='IJPA')
2    Stock(conId=153454120, symbol='EMIM', exchange='AEB', currency='EUR', localSymbol='EMIM', tradingClass='EMIM')

我想从字符串中提取数据并将其组织为列。如您所见,并非所有行都包含相同的数据,而且它们的顺序也不相同。我只需要一些列;这是预期的输出:

     Type      conId symbol  localSymbol
0  Future  462009617    CGB       CGBZ21
1   Stock   80268543   IJPA         IJPA
2   Stock  153454120   EMIM         EMIM

我用 str.extract 做了一些测试,但没有得到我想要的。

关于如何实现它的任何想法? 谢谢

【问题讨论】:

    标签: python python-3.x pandas string


    【解决方案1】:

    您可以使用字符串方法尝试此操作。假设字符串存储在名为 'main_col' 的列中:

    df["Type"] = df.main_col.str.split("(", expand = True)[0]
    df["conId"] = df.main_col.str.partition("conId=")[2].str.partition(",")[0]
    df["symbol"] = df.main_col.str.partition("symbol=")[2].str.partition(",")[0]
    df["localSymbol"] = df.main_col.str.partition("localSymbol=")[2].str.partition(",")[0]
    

    【讨论】:

    • 感谢您的回答。第一行代码引发以下 ValueError:值长度 (2) 与索引长度 (10) 不匹配,您知道为什么吗?
    • 嗨,抱歉。我错过了一个参数,因此 split 仅从第一次出现的值创建一个列表。请将参数expand = True 添加到split 方法中,它应该可以正常工作。我已经对答案进行了编辑。
    • 谢谢。现在第一个命令工作正常,但第二行出现错误:“系列”对象没有属性“分区”。我对你的代码很感兴趣,因为它看起来比 Nikolaos 的更容易阅读
    • 嗨,我再次道歉,因为我错过了另一个小细节。因为我做了两次分区来获取子字符串。我应该再次使用str 作为中间Series 对象被创建。我已经做出了改变。我已经在示例上测试了代码,希望编辑后的代码对您来说可以正常工作。
    • 太好了,现在它可以工作了,而且很容易阅读
    【解决方案2】:

    使用pandas.Series.str.extract 的一种解决方案(正如您尝试使用的那样):

    >>> df
                                                                                                                                                               col
    0  Future(conId=462009617, symbol='CGB', lastTradeDateOrContractMonth='20211220', multiplier='1000', currency='CAD', localSymbol='CGBZ21', tradingClass='CGB')
    1  Stock(conId=80268543, symbol='IJPA', exchange='AEB', currency='EUR', localSymbol='IJPA', tradingClass='IJPA')                                              
    2  Stock(conId=153454120, symbol='EMIM', exchange='AEB', currency='EUR', localSymbol='EMIM', tradingClass='EMIM')
    
    >>> df.col.str.extract(r"^(?P<Type>Future|Stock).*conId=(?P<conId>\d+).*symbol='(?P<symbol>[A-Z]+)'.*localSymbol='(?P<localSymbol>[A-Z0-9]+)'")
         Type      conId symbol localSymbol
    0  Future  462009617  CGB    CGBZ21    
    1  Stock   80268543   IJPA   IJPA      
    2  Stock   153454120  EMIM   EMIM 
    

    在上面,我假设:

    • Type 采用 Future 或 Stock 两个值
    • conId 由数字组成
    • symbol 由大写字母组成
    • localSymbol 由数字和大写字母组成

    您可能希望调整模式以更好地满足您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      相关资源
      最近更新 更多