【问题标题】:Selection from a pandas DataFrame based on auxiliary series基于辅助系列从 pandas DataFrame 中进行选择
【发布时间】:2017-03-16 22:46:18
【问题描述】:

我有一个系列:

ser = pd.Series(['a','b','c'])
df = pd.DataFrame([['c',1],['d',2],['a',3]], columns=['first', 'second'])

想要获取DataFrame:

   first  second
0  c      1
1  a      3

也就是说,我想说df[df.first in ser.tolist()] 之类的东西,但考虑到df.firstSeries 而不是其中的一个元素。

【问题讨论】:

    标签: python python-3.x pandas dataframe boolean


    【解决方案1】:

    选项 1
    query

    df.query('first in @ser')
    

    选项 2
    isin

    df[df['first'].isin(ser)]
    

    两者都有

      first  second
    0     c       1
    2     a       3
    

    时间参考

    def query():
        return df.query('first in @ser')
    
    def isin():
        return df[df['first'].isin(ser)]
    
    
    results = pd.DataFrame(
        index=pd.Index([10, 1000, 100000], name='group size'),
        columns=pd.Index(['query', 'isin'], name='method'),
    )
    
    from timeit import timeit
    
    for i in results.index:
        df = pd.DataFrame(dict(first=np.random.randint(10, size=i)))
        s = pd.Series(range(5))
        for j in results.columns:
            results.set_value(
                i, j,
                timeit(
                    '{}()'.format(j),
                    'from __main__ import {}, df, s'.format(j),
                    number=100
                )
            )
    
    results.plot()
    

    【讨论】:

    • 谢谢。只需为未来的用户提一下,选项 2 比选项 1 快得多:438 µs 与 1.34 ms。
    • @splinter 不要忘记接受答案并按您认为合适的方式投票。
    • @piSquared,不用担心,我不会忘记。情节也不错:)
    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2021-05-07
    相关资源
    最近更新 更多