Python 使用re.findall在无括号的数据帧中创建新列

Python 使用re.findall在无括号的数据帧中创建新列,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我试图通过在现有列上运行re.findall,在pandas数据帧中创建一个新列 我试过这个: file1['ID']=[re.findall('[a-zA-Z]+\d+$',i)代表file1.V6中的i] 这是: IDs = [] for i in file1.V6: IDs.append(re.findall(' [a-zA-Z]+\d+$',i) file1['ID'] = IDs 模式提取成功,但当我查看新创建的“ID”列时,所有值都是单元素列表,如: ['my\u ret

我试图通过在现有列上运行re.findall,在pandas数据帧中创建一个新列

我试过这个:

file1['ID']=[re.findall('[a-zA-Z]+\d+$',i)代表file1.V6中的i]

这是:

IDs = []
for i in file1.V6:
    IDs.append(re.findall(' [a-zA-Z]+\d+$',i)

file1['ID'] = IDs
模式提取成功,但当我查看新创建的“ID”列时,所有值都是单元素列表,如:

['my\u returned\u match']

我希望列中的每一行仅将匹配项作为字符串,而不是单个元素列表

非常感谢您的帮助

我想您需要帮助

file1['ID'] = file1['ID'].apply(lambda x:x[0])
编辑:

尽管这不止一行,但您可以在将其添加到数据集之前执行此操作

def return_correct(found):
    if len(found)>0:
        return found[0]
    return None

IDs.append(return_correct(re.findall(' [a-zA-Z]+\d+$',i)))

您不需要for循环。你可以

file1.V6.str.findall(' [a-zA-Z]+\d+$').transform(''.join)

对不起,我应该添加,不是所有的行都有一个现有的匹配项,所以一些列表是空的,上面给了我一个“索引器:列表索引超出范围”。另外,我想知道是否有任何方法可以在一行中完成这项工作,而不是在事后更正。这是你想要的吗?此外,如果您愿意,您可以将“无”替换为“”或类似名称。是的,谢谢您,这非常有效。我希望有一种更简单的方法来解决这个问题,我还是python新手,主要了解R,所以我正在学习这些语法差异,不用担心。如果我有帮助,请将答案投上一票并标记为正确:)如果只有一个匹配项,为什么不使用
str.extract
?为什么
findall
?我建议使用
[]
来访问数据帧列,而不是
属性样式。另外,变量名和函数名应该跟在带有下划线的
小写字母后面。当前接受的解决方案非常差,因此这肯定没有帮助。谢谢您的建议:
file1['ID']=file1.V6.str.extract(“([a-zA-Z]+\d+$)”)
我得到了命名约定点,但为什么“[]”vs“?在R中,我通常使用“$”,所以我认为这是最相似的,而且不太典型。这很有趣。这是可行的,我知道transform就像一个summary函数,只是返回对象的长度与输入的长度相同,但是为什么“”。join参数有效?我想这会把它变成一个长串接的string@Jamalan
transform
的行为与汇总函数不同。您所考虑的是
聚合
。这是一个总结功能<代码>转换
是一个向量化函数,用于对向量/序列的每个元素执行特定任务。在本例中,
join
连接系列中每个列表的所有元素。我明白了,这是一种将每个列表值转换为字符串的迂回方法。谢谢你的回答@贾玛兰:是的。或者您也可以执行
df.Species.str.findall('setosa').transform(lambda x:x[0],如果x为其他“”)