python - 将行拆分为多列,仅从行中选择某些值并删除其余值

标签 python regex python-3.x pandas dataframe

我有一个看起来像这样的 df:

name      surname     device
anna      smith       Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304
petr      lebowski    Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:48.0) Gecko/20100101 Firefox/48.0
eveline   jones       Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G903F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/5.4 Chrome/51.0.2704.106 Mobile Safari/537.36

我的目标是将这些行拆分为多列,并仅选择某些值来创建新列,以便新的数据框如下所示:

name      surname     device        column1     column2               column3
anna      smith       as in df      iPhone CPU  iPhone OS 10_3_1      Mac OS X 
petr      lebowski    as in df      Macintosh   Intel Mac OS X 10.6   rv:48.0
eveline   jones       as in df      Linux       Android 6.0.1         SAMSUNG SM-G903F Build/MMB29K

所以基本上我只想从这些行中选择某些值:只是那些用“;”分隔的括号中的值。

我知道如何将其逐个符号拆分:

def split_it(string):
    return re.findall(r"[\w']+|[.,!?;]", string)

以及如何创建具有拆分行的新列:

df['device'].str[1:-1].str.split(',', expand=True)

但是如何只选择某些值并用它们创建列不知道......

最佳答案

您需要一个更好的正则表达式:

pattern = re.compile(r"\((.+?); (.+?)(?: like|;) (.+?)\)")
new_columns = df.device.str.extract(pattern, expand=False)

您甚至可以给它们预先命名:

new_columns = df.Device.str.extract(r"\((?P<column1>.+?); (?P<column2>.+?)(?: like|;) (?P<column3>.+?)\)", expand=False)

然后,您只需将其与其余数据连接即可:

df = df.join(new_columns)

关于python - 将行拆分为多列,仅从行中选择某些值并删除其余值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499877/

相关文章:

python - 如果您要求整数但没有得到整数,是否存在异常?

python - 如何对 google AppEngine Webapp2 URL 进行 SEO Url 更改和重定向?

python - Openerp Webkit 报告给出 OsError

javascript - Javascript 的正则表达式获取子字符串

.net - 正则表达式逗号或逗号空格或空格

python - 如何禁用嵌入中字符串的 Markdown ?

python - 我将如何修复 pygame 的按键事件不执行任何操作?

python - django 中的自定义用户引发 ValueError

python - 按字符频率对字符串进行排序,按字母顺序打破联系

javascript - 为什么这个正则表达式需要这么长时间才能执行?