Python 从列中的元素提取文本,写入新列
我在熊猫数据框的一列(COL_NAME)中有一些数据。我想在“(”和“)”之间提取一些文本(这些数据要么存在,要么根本不存在paren,尽管数据中可能有多组paren)。然后我想将paren中的数据写入另一列,然后从原始字符串中删除“(XXX)” 即 求助于: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 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!)