我有一个熊猫DataFrame,其中包含一列字符串值。我需要根据部分字符串匹配来选择行。
类似于这个成语:
re.search(pattern, cell_in_question)
返回布尔值。我熟悉df[df['A']==“helloworld”]的语法,但似乎找不到一种方法来处理部分字符串匹配,比如“hello”。
我有一个熊猫DataFrame,其中包含一列字符串值。我需要根据部分字符串匹配来选择行。
类似于这个成语:
re.search(pattern, cell_in_question)
返回布尔值。我熟悉df[df['A']==“helloworld”]的语法,但似乎找不到一种方法来处理部分字符串匹配,比如“hello”。
当前回答
也许您想在Pandas数据帧的所有列中搜索一些文本,而不仅仅是在它们的子集中。在这种情况下,以下代码将有所帮助。
df[df.apply(lambda row: row.astype(str).str.contains('String To Find').any(), axis=1)]
警告这种方法虽然方便,但速度相对较慢。
其他回答
假设我们在数据帧df中有一个名为“ENTITY”的列。我们可以过滤df,以获得整个数据帧df,其中“实体”列的行不包含“DM”,方法如下:
mask = df['ENTITY'].str.contains('DM')
df = df.loc[~(mask)].copy(deep=True)
我在ipython笔记本电脑的macos上使用熊猫0.14.1。我尝试了上面的建议行:
df[df["A"].str.contains("Hello|Britain")]
并得到一个错误:
无法使用包含NA/NaN值的矢量进行索引
但当添加了“==True”条件时,效果非常好,如下所示:
df[df['A'].str.contains("Hello|Britain")==True]
有点类似于@cs95的答案,但这里不需要指定引擎:
df.query('A.str.contains("hello").values')
这是我最后为部分字符串匹配所做的。如果有人有更有效的方法,请告诉我。
def stringSearchColumn_DataFrame(df, colName, regex):
newdf = DataFrame()
for idx, record in df[colName].iteritems():
if re.search(regex, record):
newdf = concat([df[df[colName] == record], newdf], ignore_index=True)
return newdf
我的2c价值:
我执行了以下操作:
sale_method = pd.DataFrame(model_data['Sale Method'].str.upper())
sale_method['sale_classification'] = \
np.where(sale_method['Sale Method'].isin(['PRIVATE']),
'private',
np.where(sale_method['Sale Method']
.str.contains('AUCTION'),
'auction',
'other'
)
)