删除 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']]
给定一个 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']]