我有一个熊猫DataFrame,其中包含一列字符串值。我需要根据部分字符串匹配来选择行。
类似于这个成语:
re.search(pattern, cell_in_question)
返回布尔值。我熟悉df[df['A']==“helloworld”]的语法,但似乎找不到一种方法来处理部分字符串匹配,比如“hello”。
我有一个熊猫DataFrame,其中包含一列字符串值。我需要根据部分字符串匹配来选择行。
类似于这个成语:
re.search(pattern, cell_in_question)
返回布尔值。我熟悉df[df['A']==“helloworld”]的语法,但似乎找不到一种方法来处理部分字符串匹配,比如“hello”。
当前回答
假设我们在数据帧df中有一个名为“ENTITY”的列。我们可以过滤df,以获得整个数据帧df,其中“实体”列的行不包含“DM”,方法如下:
mask = df['ENTITY'].str.contains('DM')
df = df.loc[~(mask)].copy(deep=True)
其他回答
假设您有以下DataFrame:
>>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b'])
>>> df
a b
0 hello hello world
1 abcd defg
您始终可以在lambda表达式中使用in运算符来创建筛选器。
>>> df.apply(lambda x: x['a'] in x['b'], axis=1)
0 True
1 False
dtype: bool
这里的技巧是在apply中使用axis=1选项,将元素逐行传递给lambda函数,而不是逐列传递。
我的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'
)
)
如果有人想知道如何执行相关问题:“按部分字符串选择列”
Use:
df.filter(like='hello') # select columns which contain the word hello
若要通过部分字符串匹配来选择行,请将axis=0传递到筛选器:
# selects rows which contain the word hello in their index label
df.filter(like='hello', axis=0)
一个更一般的例子-如果在字符串中查找单词或特定单词的部分:
df = pd.DataFrame([('cat andhat', 1000.0), ('hat', 2000000.0), ('the small dog', 1000.0), ('fog', 330000.0),('pet', 330000.0)], columns=['col1', 'col2'])
句子或单词的特定部分:
searchfor = '.*cat.*hat.*|.*the.*dog.*'
创建显示受影响行的列(可以根据需要过滤掉)
df["TrueFalse"]=df['col1'].str.contains(searchfor, regex=True)
col1 col2 TrueFalse
0 cat andhat 1000.0 True
1 hat 2000000.0 False
2 the small dog 1000.0 True
3 fog 330000.0 False
4 pet 3 30000.0 False
也许您想在Pandas数据帧的所有列中搜索一些文本,而不仅仅是在它们的子集中。在这种情况下,以下代码将有所帮助。
df[df.apply(lambda row: row.astype(str).str.contains('String To Find').any(), axis=1)]
警告这种方法虽然方便,但速度相对较慢。