[英]Partial keyword match not working when I am trying to create a new column from a pandas data frame in python?
[英]Search for a partial string match in a data frame column from a list - Pandas - Python
我有一个清单:
things = ['A1','B2','C3']
我有一个pandas数据框,其中一列包含以分号分隔的值 - 一些行将包含与上面列表中的一个项匹配的匹配(由于它具有字符串的其他部分,因此不会完美匹配)列...例如,该列中的一行可能有'哇;这里;这= 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)]
返回一个由内部str.contains
的boolean数组掩盖的df, if
不了解如何评估一个布尔数组,从而导致错误。 如果你想一想,如果你是真的或者只有一个是真的,它该怎么办? 它期望一个标量,而不是像数组一样的值。
熊猫实际上是惊人的,但我觉得它很容易使用。 然而,它确实具有许多旨在简化生活的功能,包括用于搜索大量数据帧的工具。
虽然它可能不是您问题的完整解决方案,但这可能会帮助您摆脱困境。 我假设您知道要搜索的列,在我的示例中为A列。
import pandas as pd
df = pd.DataFrame({'A' : pd.Categorical(['Wow;Here;This=A1;10001;0', 'Another;C3;Row=Great;100', 'This;D6;Row=bad100']),
'B' : 'foo'})
print df #Original data frame
print
print df['A'].str.contains('A1|B2|C3') # Boolean array showing matches for col A
print
print df[df['A'].str.contains('A1|B2|C3')] # Matching rows
输出:
A B
0 Wow;Here;This=A1;10001;0 foo
1 Another;C3;Row=Great;100 foo
2 This;D6;Row=bad100 foo
0 True
1 True
2 False
Name: A, dtype: bool
A B
0 Wow;Here;This=A1;10001;0 foo
1 Another;C3;Row=Great;100 foo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.