如何解决Python Pandas:如果字符串值列表 == [none] explodelist.__ne__
我的数据框中有一列包含值列表。
Tags
[marvel,comics,comic,books,nerdy]
[new,snapchat,version,snap,inc]
[none]
[new,york,times,ny,nyt,times]
[today,show,today,today]
[none]
[mark,wahlberg,marky,mark]
我不知道如何从数据框中删除这个 [none] 列表。我试过了,
us_videos = us_videos.drop(us_videos.index[us_videos.tags == 'none'])
但这仅在我将列转换为字符串时才有效。如何实现这一目标?
解决方法
首先让我们编写一个函数来去除列表中的 'none'
:
print(df)
tags
0 [marvel,comics,comic,books,nerdy]
1 [new,snapchat,version,snap,inc]
2 [none]
3 [new,york,times,ny,nyt,times]
4 [today,show,today,none]
def delete_none(element):
new = []
for val in element:
if val != 'none':
new.append(val)
if len(new) == 0:
return np.nan
else:
return new
现在我们在 tags
列上应用这个函数:
df.tags.apply(delete_none)
输出:
0 [marvel,nerdy]
1 [new,inc]
2 NaN
3 [new,times]
4 [today,today]
,
新答案
OP 希望从子列表中删除 'none'
并删除只有 'none'
的行
us_videos.tags.explode().pipe(lambda s: s[s != 'none']).groupby(level=0).agg(list)
0 [marvel,nerdy]
1 [new,inc]
3 [new,times]
4 [today,today]
6 [mark,wahlberg,marky,mark]
Name: tags,dtype: object
更pythonic的方式
dat = {}
for k,v in us_videos.tags.iteritems():
for x in v:
if x != 'none':
dat.setdefault(k,[]).append(x)
pd.Series(dat,name='tags')
0 [marvel,dtype: object
在理解中使用赋值表达式
pd.Series({
k: X for k,v in us_videos.tags.iteritems()
if (X:=[*filter('none'.__ne__,v)])
},dtype: object
旧答案
explode
us_videos[us_videos.tags.explode().ne('none').any(level=0)]
tags
0 [marvel,nerdy]
1 [new,inc]
3 [new,times]
4 [today,today]
6 [mark,mark]
list.__ne__
us_videos[us_videos.tags.map(['none'].__ne__)]
tags
0 [marvel,mark]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。