Python 从列中的元素提取文本,写入新列

Python 从列中的元素提取文本,写入新列,python,pandas,dataframe,Python,Pandas,Dataframe,我在熊猫数据框的一列(COL_NAME)中有一些数据。我想在“(”和“)”之间提取一些文本(这些数据要么存在,要么根本不存在paren,尽管数据中可能有多组paren)。然后我想将paren中的数据写入另一列,然后从原始字符串中删除“(XXX)” 即 求助于: COL_NAME NEW_COL ======== ======= text (yay!) info i love text None Text is fun Non

我在熊猫数据框的一列(COL_NAME)中有一些数据。我想在“(”和“)”之间提取一些文本(这些数据要么存在,要么根本不存在paren,尽管数据中可能有多组paren)。然后我想将paren中的数据写入另一列,然后从原始字符串中删除“(XXX)”

求助于:

COL_NAME          NEW_COL
========          =======
text (yay!)       info
i love text       None
Text is fun       None
more text         more info
lots text (boo!)  None
我可以通过隔离列、迭代其元素、在()上拆分、创建两个新列表,然后将它们添加到数据帧来实现这一点,但确实有一种更具python/Pandic风格的方法来实现,对吗


谢谢!

不清楚为什么第二个括号不匹配。可能是因为char

然后您可以使用正则表达式

正则表达式
\([A-Za-z0-9\]+)\
表示:

  • \(
    匹配文本
    字符
  • 开始一个新组
  • [A-Za-z0-9}
    是与任何字母(大写或小写)、数字或下划线和空格匹配的字符集
  • +
    与前面的元素(字符集)匹配一次或多次
  • 结束分组
  • \)
    匹配文字
    字符
  • 第二个括号不匹配,因为正则表达式排除字符
    -它不在括号中
    [A-Za-z0-9.]


    (信息)文本耶!)
    中,为什么
    info
    而不是
    ?当您遍历元素时,能否向我们展示您的代码?我不想编写拆分函数(而且必须猜测它的功能)。我非常怀疑他是否将
    lotsa text(boo!)
    编码为
    lots text(boo!)
    ,因为我正在撕开的文本在字符串的开头有一些我感兴趣的内容,但是在字符串的末尾可能还有一些其他的东西,我想留下来。这很好用!非常感谢你。值得注意的是:@jezrael,它在col2中的“剩余”文本上留下了一个前导空格。现在有一个将lstrip应用于数据帧的整个列的问题……但是感谢您提供了解释得很好的答案!
    COL_NAME          NEW_COL
    ========          =======
    text (yay!)       info
    i love text       None
    Text is fun       None
    more text         more info
    lots text (boo!)  None
    
    import pandas as pd
    import numpy as np
    import io
    
    temp=u"""(info) text (yay!)
    I love text
    Text is fun
    (more info) more text
    lotsa text (boo!)"""
    
    df = pd.read_csv(io.StringIO(temp), header=None, names=['original'])
    print df
    #                  original
    #0       (info) text (yay!)
    #1              I love text
    #2              Text is fun
    #3  (more info) more text
    #4        lotsa text (boo!)
    
    df['col1'] = df['original'].str.extract(r"\(([A-Za-z0-9 _]+)\)")
    df['col2'] = df['original'].str.replace(r"\(([A-Za-z0-9 _]+)\)", "")
    print df
    #                original       col1               col2
    #0     (info) text (yay!)       info        text (yay!)
    #1            I love text        NaN        I love text
    #2            Text is fun        NaN        Text is fun
    #3  (more info) more text  more info          more text
    #4      lotsa text (boo!)        NaN  lotsa text (boo!)