根据 DataFrame 列中的某些字符保留部分字符串

Keep part of string based on certain characters in a DataFrame column

我知道围绕这个主题有很多问题,但我没有找到任何描述我的问题的问题。我有一个 df,其中的特定列如下所示:

colA   
['drinks/coke/diet', 'food/spaghetti']
['drinks/water', 'drinks/tea', 'drinks/coke', 'food/pizza']
['drinks/coke/diet', 'drinks/coke']
...

colA 的值是字符串而不是列表。我想要实现的是一个新列,其中我只保留包含 'coke' 的部分值。 Coke 可以在字符串中重复任意次数,也可以出现在任意位置。 '' 之间的值并不总是包含由 /.

分隔的相等数量的值

所以结果应该是这样的:

colA                                                               colB
['drinks/coke/diet', 'food/spaghetti']                           'drinks/coke/diet'
['drinks/water', 'drinks/tea', 'drinks/coke', 'food/pizza']      'drinks/coke'
['drinks/coke/diet', 'drinks/coke']                              'drinks/coke/diet', 'drinks/coke'
...

我试过调用函数:

import json
df['coke'] = df['colA'].apply(lambda secties: [s for s in json.loads(colA) if 'coke' in s], meta=str)

但是这个一直抛出我不知道如何解决的错误。

您可以用逗号和 explode 分隔来创建一个系列。然后使用 str.contains 创建一个布尔掩码,您可以使用它来过滤包含单词“coke”的项目。最后 join 字符串返回索引:

s = df['colA'].str.split(',').explode()
df['colB'] = s[s.str.contains('coke')].groupby(level=0).apply(','.join).str.strip('[]')

输出:

                                                colA                                  colB  
0             ['drinks/coke/diet', 'food/spaghetti']                    'drinks/coke/diet'  
1  ['drinks/water', 'drinks/tea', 'drinks/coke', ...                         'drinks/coke'  
2                ['drinks/coke/diet', 'drinks/coke']     'drinks/coke/diet', 'drinks/coke'  

尝试将字符串拆分成一个列表,然后在列表中检查 coke,如下所示:

import json
df['coke'] = df['colA'].apply(lambda secties: [s for s in json.loads(colA.split("/")) if 'coke' in s], meta=str)