代码之家  ›  专栏  ›  技术社区  ›  Ξένη Γήινος

给定DataFrame中一列中的值列表,如何从同一行中的另一列输出值?

  •  0
  • Ξένη Γήινος  · 技术社区  · 3 年前

    问题很简单,输入是非容器对象的列表( int , str 等等),列表中的所有元素都包含在 DataFrame

    from pandas import DataFrame
    digits = '0123456789abcdef'
    df = DataFrame([(a,b) for a, b in zip(digits, range(16))], columns=['hex', 'dec'])
    df
    df.loc[df.dec == 12, 'hex']
    df.loc[df.dec == 12, 'hex'].values[0]
    import random
    eight = random.sample(range(16), 8)
    eight
    fun = lambda x: df.loc[df.dec == x, 'hex'].values[0]
    ''.join(fun(i) for i in eight)
    ''.join(map(fun, eight))
    

    正如你所看到的,我已经可以做到这一点了,但是我使用了for循环,我知道性能不是很好 pandas numpy 都是关于矢量化的,我想知道有没有一个内置的方法来做到这一点。。。

    In [1]: from pandas import DataFrame
    
    In [2]: digits = '0123456789abcdef'
    
    In [3]: df = DataFrame([(a,b) for a, b in zip(digits, range(16))], columns=['hex', 'dec'])
    
    In [4]: df
    Out[4]:
       hex  dec
    0    0    0
    1    1    1
    2    2    2
    3    3    3
    4    4    4
    5    5    5
    6    6    6
    7    7    7
    8    8    8
    9    9    9
    10   a   10
    11   b   11
    12   c   12
    13   d   13
    14   e   14
    15   f   15
    
    In [5]: df.loc[df.dec == 12, 'hex']
    Out[5]:
    12    c
    Name: hex, dtype: object
    
    In [6]: df.loc[df.dec == 12, 'hex'].values[0]
    Out[6]: 'c'
    
    In [7]: import random
    
    In [8]: eight = random.sample(range(16), 8)
    
    In [9]: eight
    Out[9]: [9, 7, 1, 6, 11, 12, 14, 10]
    
    In [10]: fun = lambda x: df.loc[df.dec == x, 'hex'].values[0]
    
    In [11]: ''.join(fun(i) for i in eight)
    Out[11]: '9716bcea'
    
    In [12]: ''.join(map(fun, eight))
    Out[12]: '9716bcea'
    
    In [13]: %timeit ''.join(fun(i) for i in eight)
    2.34 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [14]: %timeit ''.join(map(fun, eight))
    2.34 ms ± 134 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    那么,什么是矢量化的方法来实现与代码中演示的方法相同的结果呢?

    1 回复  |  直到 3 年前
        1
  •  1
  •   mozway    3 年前

    矢量化方法是构造一个系列:

    series = df.set_index('dec')['hex']
    ''.join(series[eight])
    

    '9716bcea'