pd.Series of Lists - 检查列表中的元素

Ale*_*lex 2 python pandas

我有一个 DataFrame,其中一列将列表作为条目。对于给定的给定值,x我想得到一个 pd.Series 布尔值,告诉我是否x在每个列表中。例如,给定 DataFrame

    index    lists
    0        []
    1        [1, 2]
    2        [1]
    3        [3, 4]
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情df.lists.contains(1)然后回来False, True, True, False

我知道我可以用一个Python循环或理解这样做,但我非常喜欢熊猫的解决方案类似df.moddf.isin等等。

Max*_*axU 6

In [79]: df['lists'].apply(lambda c: 1 in c)
Out[79]:
0    False
1     True
2     True
3    False
Name: lists, dtype: bool
Run Code Online (Sandbox Code Playgroud)

PS我认为在这种情况下列表理解解决方案可能会更快

40.000 行 DF 的时间:

In [81]: df = pd.concat([df] * 10**4, ignore_index=True)

In [82]: df.shape
Out[82]: (40000, 2)

In [83]: %timeit df['lists'].apply(lambda c: 1 in c)
22.5 ms ± 87.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [84]: %timeit [1 in x for x in df['lists']]
4.87 ms ± 25.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)

  • @Alex,`apply` 在底层对 `for ... loop` 进行了一些优化,因此与 `DataFrame.apply(...)` 相比,列表理解通常更快 (2认同)