我正在清理数据集,我想从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, "")
然后循环删除没有这两个功能的行。
任何想法如何改进?
答案 0 :(得分:0)
您可以将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。