【问题标题】:pd.Series of Lists - Check for Element in Listspd.Series of Lists - 检查列表中的元素
【发布时间】:2018-03-31 02:42:29
【问题描述】:

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

    index    lists
    0        []
    1        [1, 2]
    2        [1]
    3        [3, 4]

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

我知道我可以通过 Python 循环或理解来做到这一点,但理想情况下,我希望使用类似于 df.moddf.isin 等的 Pandas 解决方案。

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    In [79]: df['lists'].apply(lambda c: 1 in c)
    Out[79]:
    0    False
    1     True
    2     True
    3    False
    Name: lists, dtype: bool
    

    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)
    

    【讨论】:

    • 哦!我不知何故忘记了apply——我多么愚蠢!为什么列表理解会更快?
    • @Alex, apply 在底层进行了一些优化 for ... loop,因此与 DataFrame.apply(...) 相比,列表理解通常更快
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2022-12-17
    • 2021-09-25
    • 2014-06-10
    相关资源
    最近更新 更多