Python Pandas:如果字符串列表值== [none],则从数据帧中删除行

3

我有一个数据框中的列包含值列表。

 Tags
 [marvel, comics, comic, books, nerdy]
 [new, snapchat, version, snap, inc]
 [none]
 [new, york, times, ny, times, nyt, times]
 [today, show, today, show, today]
 [none]
 [mark, wahlberg, marky, mark]

我不知道如何从数据框中删除这个 [none] 列。我尝试了:
 us_videos = us_videos.drop(us_videos.index[us_videos.tags == 'none'])

但这只有在我将列转换为字符串时才有效。如何实现?


尝试使用以下代码:us_videos[us_videos.tags.map(['none'].__ne__)] - piRSquared
2个回答

2

首先,让我们编写一个函数来去除列表中的'none'

print(df)

    tags
0   [marvel, comics, comic, books, nerdy]
1   [new, snapchat, version, snap, inc]
2   [none]
3   [new, york, times, ny, times, nyt, times]
4   [today, show, 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, comics, comic, books, nerdy]
1           [new, snapchat, version, snap, inc]
2                                           NaN
3    [new, york, times, ny, times, nyt,  times]
4             [today, show, today, show, today]

它没有起作用。'DataFrame'对象没有'str'属性。 - Amal Nasir
它正在工作,谢谢!这将删除列表中的每个none,即使它位于列表中间,例如[today,show,today,show,today,none],对吗?如果我只想删除单个[none],怎么办? - Amal Nasir
哦!那就不同了。我以为你想完全摆脱那一行。我会更新我的答案。 - ashkangh
1
我们可以从数据框中删除NaN值。非常感谢! - Amal Nasir
1
我创建了一个新的数据框,其中在列表元素之间有 none,并编写了一个函数,如果列表只有 none,则返回 np.nan,否则它会从列表中删除 none。让我知道它的工作情况如何。 - ashkangh
没错,你可以在数据框上轻松进行布尔掩码选择。祝你好运! - ashkangh

2

新答案

OP想要从子列表中删除'none',并且删除只包含'none'的行。

us_videos.tags.explode().pipe(lambda s: s[s != 'none']).groupby(level=0).agg(list)

0        [marvel, comics, comic, books, nerdy]
1          [new, snapchat, version, snap, inc]
3    [new, york, times, ny, times, nyt, times]
4            [today, show, today, show, today]
6                [mark, wahlberg, marky, mark]
Name: tags, dtype: object

更符合Python风格的方法
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, comics, comic, books, nerdy]
1          [new, snapchat, version, snap, inc]
3    [new, york, times, ny, times, nyt, times]
4            [today, show, today, show, today]
6                [mark, wahlberg, marky, mark]
Name: tags, dtype: object

使用推导式中的赋值表达式

pd.Series({
    k: X for k, v in us_videos.tags.iteritems()
    if (X:=[*filter('none'.__ne__, v)])
}, name='tags')

0        [marvel, comics, comic, books, nerdy]
1          [new, snapchat, version, snap, inc]
3    [new, york, times, ny, times, nyt, times]
4            [today, show, today, show, today]
6                [mark, wahlberg, marky, mark]
Name: tags, dtype: object

OLD ANSWERS

explode

us_videos[us_videos.tags.explode().ne('none').any(level=0)]

                                        tags
0      [marvel, comics, comic, books, nerdy]
1        [new, snapchat, version, snap, inc]
3  [new, york, times, ny, times, nyt, times]
4          [today, show, today, show, today]
6              [mark, wahlberg, marky, mark]

list.__ne__

us_videos[us_videos.tags.map(['none'].__ne__)]

                                        tags
0      [marvel, comics, comic, books, nerdy]
1        [new, snapchat, version, snap, inc]
3  [new, york, times, ny, times, nyt, times]
4          [today, show, today, show, today]
6              [mark, wahlberg, marky, mark]

这个运行得很好!它只删除了列中的 [none],而不是列表内部的 none,[today, show, today, show, today, none],对吗? - Amal Nasir
那是正确的...现在它变得正确了。我将“all”改为“any”。 - piRSquared
这并不会从列表中删除 'none'。它只是返回包含列表中 'none' 值的相同列表。它适用于 'none' 是唯一元素的列表。我错了吗? - ashkangh
你没有错。我可能误解了你的需求。如果你想从列表中删除 'none' 并且 删除包含仅 'none' 的行... 稍等一下。 - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接