如果组中的最后一个元素包含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_duplicatescontains

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函数获取每个组中的最后一个值

如果系列的值包含pandas中的特定字符集,则替换后续字符

元组中的 OCaml 意外类型不匹配

到目前为止,按同一组中的聚合元素分组 - Pandas

Pandas:如果特定列不包含特定文本,则删除数据框中的行