我正在清理一个数据集,我想从Pandas系列中提取一些特性(并删除没有这些特性的行)。
基本上,我想把这个变成:
meter
Author: Stephen Duck Metrical foot type: iambic (-+) Metrical foot number: pentameter (5 feet) Rhyme scheme: aa
Author: Marko bulk Metrical foot type: anapaestic (--+) Metrical foot number: trimeter Rhyme scheme: ababcdcd对此:
foot feet_number
iambic pentameter
anapaestic trimeter我已经成功地完成了下面的代码,我制作了本系列的一个副本来使用替换函数。
它不是Pythonic的,我相信它也不是熊猫最有效的使用方式。我循环两次找到第一个特性,然后再循环两个循环来找到第二个特性。
这适用于第一个特性(对于具有不同模式的第二个特性也是如此)
pattern1=r'.* Metrical foot type: '
pattern2=r'\( .* \) Metrical foot number: '
dataset['meter']=dataset['meter'].str.replace(pattern1, "")
dataset['meter']=dataset['meter'].str.replace(pattern2, "")然后循环删除没有这两个特性的行。
有什么办法可以改进吗?
发布于 2018-01-26 20:59:27
您可以在以下表达式中使用str.extract():
foot type:\s+(?P<foot>\w+)
.*?
foot number:\s+(?P<feet_number>\w+)
在Python中
import pandas as pd
df = pd.DataFrame({'meter': ['Author: Stephen Duck Metrical foot type: iambic (-+) Metrical foot number: pentameter (5 feet) Rhyme scheme: aa', 'Author: Marko bulk Metrical foot type: anapaestic (--+) Metrical foot number: trimeter Rhyme scheme: ababcdcd']})
df[['foot', 'feet_number']] = df['meter'].str.extract(r'foot type:\s+(?P<foot>\w+).*?foot number:\s+(?P<feet_number>\w+)', expand=True)
print(df)这产生了:
meter foot feet_number
0 Author: Stephen Duck Metrical foot type: iambi... iambic pentameter
1 Author: Marko bulk Metrical foot type: anapaes... anapaestic trimeter
见a demo for the expression on regex101.com。
https://stackoverflow.com/questions/48468660
复制相似问题