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



我知道围绕这个主题有很多问题,但我没有找到任何描述我问题的问题。我有一个df,有一个特定的列,看起来像这样:

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

colA的值是一个字符串而不是一个列表。我想要实现的是一个新的列,在那里我只保留包含"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创建一个布尔掩码,您可以使用它来过滤包含单词"的项;焦炭";。最后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)

最新更新