如何提取Pandas DataFrame列中括号内的字符串至新列?
解决方案:提取入住人与预订人信息
看起来你已经搞定了头衔提取的部分,不过先帮你修正下之前的头衔提取代码——那个for循环是多余的,直接一行就能搞定:
import pandas as pd from pandas import Series, DataFrame # 你的原始数据 names = ['Banana, Andrew Something (Maria Banana)', 'Willis, Mr. Bruce (Demi Moore)', 'Crews, Master Terry'] room = [100, 330, 212] hotel_loon = {'Name' : Series(names), 'Room' : Series(room)} hotel_loon_df = DataFrame(hotel_loon) # 修正后的头衔提取(去掉无用循环) hotel_loon_df['Title'] = hotel_loon_df['Name'].str.extract(r'([A-Za-z]+)\.', expand=False)
接下来解决提取括号内入住人的问题,我们可以用正则表达式+填充空值的组合,一步到位处理两种场景(有括号/无括号):
步骤1:提取括号内的入住人姓名
用str.extract匹配括号中的内容,正则表达式r'\((.*?)\)'会精准捕获括号里的所有字符(非贪婪模式,避免意外匹配多个括号):
# 提取入住人(括号内的内容) hotel_loon_df['Guest'] = hotel_loon_df['Name'].str.extract(r'\((.*?)\)', expand=False)
步骤2:处理无括号的情况(预订人=入住人)
当没有括号时,Guest列会是NaN,这时候我们需要先提取纯预订人姓名(去掉括号及里面的内容),再用这个值填充空的Guest列:
# 提取纯预订人姓名(去掉括号及括号内的内容) hotel_loon_df['Booker'] = hotel_loon_df['Name'].str.replace(r'\s*\(.*\)', '', regex=True) # 填充空值:如果没有入住人,就用预订人姓名填充 hotel_loon_df['Guest'] = hotel_loon_df['Guest'].fillna(hotel_loon_df['Booker'])
最终结果
运行完上面的代码后,你的DataFrame会变成这样:
| Name | Room | Title | Booker | Guest |
|---|---|---|---|---|
| Banana, Andrew Something (Maria Banana) | 100 | NaN | Banana, Andrew Something | Maria Banana |
| Willis, Mr. Bruce (Demi Moore) | 330 | Mr | Willis, Mr. Bruce | Demi Moore |
| Crews, Master Terry | 212 | Master | Crews, Master Terry | Crews, Master Terry |
关键正则解释
r'\((.*?)\)':匹配(开头、)结尾的内容,.*?是非贪婪匹配,确保只捕获一对括号内的内容r'\s*\(.*\)':匹配括号及括号前的任意空格,用空字符串替换,得到纯预订人姓名
内容的提问来源于stack exchange,提问作者bls
相关产品推荐
相关产品推荐

