如果组中的最后一个元素包含Pandas中的特定字符串,则标记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果组中的最后一个元素包含Pandas中的特定字符串,则标记相关的知识,希望对你有一定的参考价值。
我有数据:
Group string
A Hello
A SearchListing
A GoSearch
A pen
A Hello
A Searches
B Real-Estate
B Access
B Denied
B Group
B Group
C Glance
C NoSearch
C Home
C FullSearch
等等。
我想找到那些包含“search”作为最后一个元素的字符串并标记它们的组。例如,我想要的输出是这样的:
Group Flag
A 1
B 0
C 1
因为A和C的最后一个元素都包含字符串“search”。我知道一种方法可以迭代所有元素,如果最后一个元素包含“搜索”,它将标记它。但它使用循环的功能非常繁重。这有更直接的方式吗?
答案
使用str.contains
:
(df.groupby('Group')['string']
.last()
.str.contains('search', case=False)
.astype(int)
.rename('Flag')
.reset_index())
Group Flag
0 A 1
1 B 0
2 C 1
与上面类似(复制或重置索引以避免SettingWithCopyWarning
)。
u = df.drop_duplicates('Group', keep='last').reset_index(drop=True)
u['Flag'] = u.pop('string').str.contains('search', case=False).astype(int)
u
Group Flag
0 A 1
1 B 0
2 C 1
另一答案
使用drop_duplicates
和contains
yourdf=df.drop_duplicates('Group',keep='last').\
assign(Flag=lambda x : x['string'].str.contains('Search'))
yourdf
Out[645]:
Group string Flag
5 A Searches True
10 B Group False
14 C FullSearch True
另一答案
这也有效:
df.groupby('Group')['string'].apply(lambda x: 'search' in x.str.cat().lower()).reset_index(name='Flag')
输出:
Group Flag
0 A True
1 B False
2 C True
速度比较
%%timeit
df.drop_duplicates('Group',keep='last').\
assign(Flag=lambda x : x['string'].str.contains('Search'))
# 1000 loops, best of 3: 1.1 ms per loop
%%timeit
df.groupby("Group")["string"] \
.apply(lambda x: int("search" in x.values[-1].lower())) \
.reset_index(name="Flag")
# 1000 loops, best of 3: 1.6 ms per loop
%timeit df.groupby('Group')['string'].apply(lambda x: 'search' in x.str.cat().lower()).reset_index(name='Flag')
# 100 loops, best of 3: 1.86 ms per loop
%%timeit
(df.groupby('Group')['string']
.last()
.str.contains('search', case=False)
.astype(int)
.rename('Flag')
.reset_index())
# 100 loops, best of 3: 2.14 ms per loop
另一答案
你可以尝试:
df.groupby("Group")["string"] \
.apply(lambda x: int("search" in x.values[-1].lower())) \
.reset_index(name="Flag")
Group Flag
0 A 1
1 B 0
2 C 1
功能方面(以下评论):
def last_search(df, word):
return df.groupby("Group")["string"].apply(lambda x: int(word in x.values[-1].lower())).reset_index(name="Flag")
last_search(df, "search")
Group Flag
0 A 1
1 B 0
2 C 1
PS
其他答案也可以这样做
以上是关于如果组中的最后一个元素包含Pandas中的特定字符串,则标记的主要内容,如果未能解决你的问题,请参考以下文章
如果 NaN 用另一列替换,Pandas 将组中的最后一项替换
pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值groupby.nth函数获取每个组中的最后一个值