pandas 基于列表搜索串联列中的值

7cjasjjr  于 2023-02-02  发布在  其他
关注(0)|答案(4)|浏览(140)

我想知道是否有一种方法可以在不取消连接列的情况下从连接列的列表中搜索值。
以下表为例:
| 识别号|情趣用品|
| - ------|- ------|
| 1个|香蕉、大米、土豆|
| 第二章| cucumber ,早餐|
| 三个|天堂,水桶,考验|
| 四个|球,锅,糖果,衬衫|
| 五个|绘画、手机、泡泡|
我想基于列表创建另一列,如下所示:

list_0 = ["Ball", "cellphone", "breakfast", "rice", "test"]

新定义:
| 识别号|列表内容|
| - ------|- ------|
| 1个|大米|
| 第二章|早餐|
| 三个|测验|
| 四个|球|
| 五个|手机|
有没有可能?

tv6aics1

tv6aics11#

使用str.split和 * 列表组件 *:

df["List Stuff"] = [x for l in df.pop("Aleatory Stuff").str.split(", ")
                    for x in l if x in list_0]

输出:

print(df)

   ID List Stuff
0   1       rice
1   2  breakfast
2   3       test
3   4       Ball
4   5  cellphone
drnojrws

drnojrws2#

你可以尝试这样做。你可以使用str.split(", ")来拆分字符串列Aleatory stuff,其中", "是你的大小写中单词之间的分隔符。一旦项目被拆分,你可以使用set.intersection(set)来查找每一行和列表之间的公共项目。
你可以用一个类似的例子来检查我的代码:

import pandas as pd 

test_data = [
    {"id": 1, "aleatory_stuff": "banana, rice, potato"},
    {"id": 2, "aleatory_stuff": "cucumber, breakfast"}
]

test_list = ["rice", "cucumber"]

test_df = pd.DataFrame(test_data)
test_df["list_stuff"] = test_df["aleatory_stuff"].str.split(", ").apply(lambda x: list(set(x).intersection(set(test_list)))[0])

print(test_df)
id        aleatory_stuff list_stuff
0   1  banana, rice, potato       rice
1   2   cucumber, breakfast   cucumber
qzwqbdag

qzwqbdag3#

extractall用于聚合:

import re

pattern = '|'.join(map(re.escape, list_0))
# 'Ball|cellphone|breakfast|rice|test'

df['List Stuff'] = (df['Aleatory Stuff'].str.extractall(f'({pattern})')
                    [0].groupby(level=0).agg(', '.join)
                   )
  • 注意:如果您想要不区分大小写的匹配,请将flags=re.I作为参数添加到extractall。*

输出:

ID           Aleatory Stuff List Stuff
0   1     banana, rice, potato       rice
1   2      cucumber, breakfast  breakfast
2   3     Heaven, Bucket, test       test
3   4  Ball, Pan, Candy, shirt       Ball
4   5  draw, cellphone, bubble  cellphone
mnemlml8

mnemlml84#

让我们使用str.findall来查找匹配regex模式的所有示例

pat = r'(?i)\b(%s)\b' % '|'.join(list_0)
df['List Stuff'] = df['Aleatory Stuff'].str.findall(pat).str.join(',')
ID           Aleatory Stuff List Stuff
0   1     banana, rice, potato       rice
1   2      cucumber, breakfast  breakfast
2   3     Heaven, Bucket, test       test
3   4  Ball, Pan, Candy, shirt       Ball
4   5  draw, cellphone, bubble  cellphone

PS:正则表达式标记(?i)用于不区分大小写的匹配

相关问题