Python 在系列中保留具有模式的元素,而不将其转换为列表
我有以下数据帧:Python 在系列中保留具有模式的元素,而不将其转换为列表,python,regex,pandas,list,series,Python,Regex,Pandas,List,Series,我有以下数据帧: df = pd.DataFrame(["Air type:1, Space kind:2, water", "something, Space blu:3, somethingelse"], columns = ['A']) 我想创建一个新列,其中包含每行中包含:的所有元素。例如,在第一行,我想返回type:1,kind:2,在第二行,我想返回blu:3。我通过以下方式使用列表理解进行管理: df['new'] = [[y for y
df = pd.DataFrame(["Air type:1, Space kind:2, water", "something, Space blu:3, somethingelse"], columns = ['A'])
我想创建一个新列,其中包含每行中包含:的所有元素。例如,在第一行,我想返回type:1,kind:2,在第二行,我想返回blu:3。我通过以下方式使用列表理解进行管理:
df['new'] = [[y for y in x if ":" in y] for x in df['A'].str.split(",")]
但我的问题是,新列包含列表元素
A new
0 Air type:1, Space kind:2, water [Air type:1, Space kind:2]
1 something at the start:4, Space blu:3, somethingelse [something at the start:4, Space blu:3]
我并没有经常使用Python,所以我不会百分之百地怀疑我是否缺少一种更具体的方法来实现这一点。如果有一个,我们非常乐意了解并使用它。
如果这是一种正确的方法,如何将元素转换回字符串,以便对其执行正则表达式?我试过了,但它没有按我希望的那样工作。您可以在这里使用
编辑:
如果有多个单词,请尝试
df['new'] = df['A'].str.findall('[^\s,][^:,]+:[^:,]+').str.join(', ')
A new
0 Air type:1, Space kind:2, water Air type:1, Space kind:2
1 something, Space blu:3, somethingelse Space blu:3
你可以在这里用
编辑:
如果有多个单词,请尝试
df['new'] = df['A'].str.findall('[^\s,][^:,]+:[^:,]+').str.join(', ')
A new
0 Air type:1, Space kind:2, water Air type:1, Space kind:2
1 something, Space blu:3, somethingelse Space blu:3
您可以将findall与join一起使用:
作为pd进口熊猫
DataFrame[type:1,kind:2,water,something,blu:3,somethingelse],columns=['A']
df['new']=df['A'].str.findallr'[^\s:,]+:[^\s,]+'.str.join','
df['新']
=>0类型:1,种类:2
=>1蓝色:3
正则表达式匹配
[^\s:,]+-除空格外的一个或多个字符:和,
:-冒号
[^\s,]+-除空格和之外的一个或多个字符,。
看
.str.join“,”用+空格表示所有找到的匹配项。您可以将findall与join一起使用:
作为pd进口熊猫
DataFrame[type:1,kind:2,water,something,blu:3,somethingelse],columns=['A']
df['new']=df['A'].str.findallr'[^\s:,]+:[^\s,]+'.str.join','
df['新']
=>0类型:1,种类:2
=>1蓝色:3
正则表达式匹配
[^\s:,]+-除空格外的一个或多个字符:和,
:-冒号
[^\s,]+-除空格和之外的一个或多个字符,。
看
.str.join“,”将所有找到的匹配项与,+空格连接。谢谢!您将如何处理以下情况:前面有多个单词。我已经更新了我的代码示例为我忘记放一个双字示例而道歉there@User2321Ch3steR建立在我的模式之上。r'[^\s:,][^:,]*:[^:,]+'暂时就可以了。新的一天,新的问题:谢谢!您将如何处理以下情况:前面有多个单词。我已经更新了我的代码示例为我忘记放一个双字示例而道歉there@User2321Ch3steR建立在我的模式之上。r'[^\s:,][^:,]*:[^:,]+'暂时可以。新的一天,新的问题:@User2321更新了答案。修改了regex模式以避免额外的空间,但是可能有一个比这个更好的regex模式。谢谢。基于问题和解决方案的规范,正则表达式优化对我来说不是头等大事:@User2321更新了答案。修改了regex模式以避免额外的空间,但是可能有一个比这个更好的regex模式。谢谢。基于问题和解决方案的规范,regex优化不是我的首要任务: