我有一个清单:
things = ['A1','B2','C3']
我有一个熊猫数据框,其中的一列包含用分号分隔的值-有些行将包含与上面列表中的一项匹配的匹配项(这不是完美匹配,因为它具有字符串中的其他部分列。例如,该列中的行可能具有“哇;这里;此= A1 ; 10001; 0”)
我想保存包含与列表中的项目匹配的行,然后使用这些选定的行(应具有相同的标题)创建一个新的数据框。这是我尝试的:
import re
for_new_df =[]
for x in df['COLUMN']:
for mp in things:
if df[df['COLUMN'].str.contains(mp)]:
for_new_df.append(mp) #This won't save the whole row - help here too, please.
这段代码给了我一个错误:
ValueError:DataFrame的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
我对编码非常陌生,因此答案中的解释和细节越多越好!提前致谢。
您可以通过加入单词列表来创建正则表达式并使用来避免循环str.contains
:
pat = '|'.join(thing)
for_new_df = df[df['COLUMN'].str.contains(pat)]
应该工作
因此,正则表达式模式变为:'A1|B2|C3'
它将与包含这些字符串中任何一个的字符串中的任何位置匹配
例子:
In [65]:
things = ['A1','B2','C3']
pat = '|'.join(things)
df = pd.DataFrame({'a':['Wow;Here;This=A1;10001;0', 'B2', 'asdasda', 'asdas']})
df[df['a'].str.contains(pat)]
Out[65]:
a
0 Wow;Here;This=A1;10001;0
1 B2
至于失败的原因:
if df[df['COLUMN'].str.contains(mp)]
这行:
df[df['COLUMN'].str.contains(mp)]
返回一个由您的内部布尔数组掩盖的df str.contains
,if
不了解如何计算布尔数组,因此会出错。如果您考虑一下,如果您选择1个True或除1个True之外的所有商品,应该怎么办?它期望一个标量而不是像value这样的数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句