我知道围绕这个主题有很多问题,但我没有找到任何描述我问题的问题。我有一个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)