You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中提取含字符串、逗号和整数的括号内的字符串

问题:从Pandas DataFrame的元组中提取字符串名称

我正在尝试从包含字符串、逗号和整数的括号(元组)中提取字符串名称。当前我的Pandas DataFrame输出如下:

print(df1)

      name                                    matches      best match        best 2        best 3
0  aparna    [(aparn, 91), (Pankaj, 67), (arup, 45)]     (aparn, 91)  (Pankaj, 67)    (arup, 45)
1  pankaj    [(Pankaj, 100), (aparn, 55), (abc, 30)]   (Pankaj, 100)   (aparn, 55)     (abc, 30)
2  sudhir  [(sudhir c, 95), (arup, 22), (aparn, 18)]  (sudhir c, 95)    (arup, 22)   (aparn, 18)
3   Geeku     [(Geek, 89), (arup, 22), (Pankaj, 18)]      (Geek, 89)    (arup, 22)  (Pankaj, 18)

期望的DataFrame输出:

print(df1)

      name                                    matches   best match   best 2   best 3
0  aparna    [(aparn, 91), (Pankaj, 67), (arup, 45)]     aparn      Pankaj   arup
1  pankaj    [(Pankaj, 100), (aparn, 55), (abc, 30)]     Pankaj     aparn    abc
2  sudhir  [(sudhir c, 95), (arup, 22), (aparn, 18)]     sudhir c   arup     aparn
3   Geeku     [(Geek, 89), (arup, 22), (Pankaj, 18)]     Geek       arup     Pankaj

当前生成相关列的代码:

dframe1['best match'] = dframe1['matches'].str[0] #first best match (new column)
dframe1['best 2'] = dframe1['matches'].str[1] #2nd best match
dframe1['best 3'] = dframe1['matches'].str[2] #3nd best match

尝试过使用str.extract,但不清楚如何仅提取字母组成的部分,特此求助。


解决方案

方法1:直接访问元组的第一个元素

如果matches列中的元素是真实的Python元组,直接取元组的第一个元素即可,这是最高效的方式:

# 提取每个匹配元组的第一个元素(字符串名称)
dframe1['best match'] = dframe1['matches'].str[0].str[0]
dframe1['best 2'] = dframe1['matches'].str[1].str[0]
dframe1['best 3'] = dframe1['matches'].str[2].str[0]

方法2:正则提取(适用于字符串格式的元组)

如果你的best match等列是字符串类型(比如存储的是"(aparn, 91)"这样的文本),用正则表达式提取逗号前的内容:

# 匹配括号内、逗号前的所有字符,去除首尾空格
dframe1['best match'] = dframe1['best match'].str.extract(r'\((.*?),', expand=False).str.strip()
dframe1['best 2'] = dframe1['best 2'].str.extract(r'\((.*?),', expand=False).str.strip()
dframe1['best 3'] = dframe1['best 3'].str.extract(r'\((.*?),', expand=False).str.strip()

方法3:批量处理(简洁写法)

通过循环和apply批量生成目标列,避免重复代码:

# 定义提取名称的函数
def get_name(tuple_item):
    return tuple_item[0]

# 循环生成3个匹配列
for idx in range(3):
    col = 'best match' if idx == 0 else f'best {idx+1}'
    dframe1[col] = dframe1['matches'].str[idx].apply(get_name)

内容的提问来源于stack exchange,提问作者atom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:10:46