删除 pandas.core.series 中的某些项目

Removing certain items in a pandas.core.series

给定一个 pandas.core.series,是否可以从每个索引中删除某些项目并保留我想保留的项目?例如:

country=['China','USA','Asia','Brazil']
contents={'Tags': ['China;Panda;Brazil;Plug','USA;China;Asia','Brazil;Peanut']}
df=pd.DataFrame(contents)
tags=df["Tags"]

我希望放弃不在国家/地区列表中的值并保留其余值。因此,对于 tags[0],结果应该是 [China,Brazil]。 tags[1] 保留所有值,而 tags[2] 结果应该是 [Brazil]

tags = tags.str.split(';')

我尝试拆分;在每个值之间,但我不确定如何进行。

[[val for val in a_list if val in country] for a_list in df.Tags.str.split(";")]

对于拆分后的每个列表,仅保留 country 列表中的值

得到

[['China', 'Brazil'], ['USA', 'China', 'Asia'], ['Brazil']]

您可以创建一个函数来进行解析并将信息复制到新列。因此,例如,类似于:

from functools import partial
import numpy as np


def pars_func(countries,content_str):
    ret_str=''
    for tag in content_str.split(';'):
           if tag in country:
                ret_str=ret_str+';'+tag
    if ret_str== '':
        return np.nan
    else:
        return ret_str[1:].split(';')


df['Tags']=df['Tags'].apply(partial(pars_func,country))

分解和重组也是一种选择:

import pandas as pd

country = ['China', 'USA', 'Asia', 'Brazil']
contents = {'Tags': ['China;Panda;Brazil;Plug',
                     'USA;China;Asia',
                     'Brazil;Peanut']}
df = pd.DataFrame(contents)

e = df.Tags.str.split(';').explode()
tags = e[e.isin(country)].groupby(level=0).agg(list).tolist()
print(tags)

tags:

[['China', 'Brazil'], ['USA', 'China', 'Asia'], ['Brazil']]

带有 merge 而不是 isin 的选项:

import pandas as pd

country = ['China', 'USA', 'Asia', 'Brazil']
contents = {'Tags': ['China;Panda;Brazil;Plug',
                     'USA;China;Asia',
                     'Brazil;Peanut']}
df = pd.DataFrame(contents)

e = df.Tags.str.split(';').explode().reset_index()

tags = e.merge(
    pd.DataFrame(country, columns=['Tags']),
    on='Tags'
).groupby('index')['Tags'].agg(list).tolist()
print(tags)

tags:

[['China', 'Brazil'], ['China', 'USA', 'Asia'], ['Brazil']]