【问题标题】:Extracting text from elements in Pandas column, writing to new column从 Pandas 列中的元素中提取文本,写入新列
【发布时间】:2015-10-29 21:45:30
【问题描述】:

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

COL_NAME
========
(info) text (yay!)
I love text
Text is fun
(more info) more text
lotsa text (boo!)

转为:

COL_NAME          NEW_COL
========          =======
text (yay!)       info
i love text       None
Text is fun       None
more text         more info
lots text (boo!)  None

我可以通过隔离列、遍历其元素、在 ( 上拆分、创建两个新列表然后将它们添加到 DataFrame 来做到这一点,但肯定有一种更 Pythonic/Padic 的方式来做到这一点,对吧?

谢谢!

【问题讨论】:

  • (info) text yay!) 中,为什么是info 而不是yay!
  • 您可以在遍历元素时向我们展示您的代码吗?我不想写 split 函数(并且必须猜测它的作用)。
  • 我非常怀疑他将lotsa text (boo!) 编码为lots text (boo!)
  • 因为我正在撕裂的文本在我感兴趣的字符串开头的括号中有一些东西,但在我感兴趣的字符串末尾也可能有一些其他的东西想一起离开。

标签: python pandas dataframe


【解决方案1】:

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

然后你可以使用extract 和正则表达式。

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

  1. \( 匹配文字 ( 字符
  2. ( 开始一个新组
  3. [A-Za-z0-9 _] 是匹配任何字母(大写或小写)、数字或下划线和空格的字符集
  4. + 匹配前面的元素(字符集)一次或多次。
  5. )结束群
  6. \) 匹配文字 ) 字符

第二个括号不匹配,因为正则表达式排除字符 ! - 它不在括号 [A-Za-z0-9 _] 中。

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!)

【讨论】:

  • 这很好用!太感谢了。一个注释:@jezrael,它在 col2 中的“剩余”文本上留下了一个前导空格。现在存在将 lstrip 应用于数据框的整个列的问题......但感谢您提供详细解释的答案!
猜你喜欢
  • 2021-06-05
  • 2018-06-29
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多