代码之家  ›  专栏  ›  技术社区  ›  Sun Jar

在另一个系列中查找当前df值的索引,并将其添加到列中

  •  0
  • Sun Jar  · 技术社区  · 1 月前

    我有一个数据帧和一个序列,如下所示:

    import pandas as pd
    from itertools import permutations
    
    df = pd.DataFrame({'a': [['a', 'b', 'c'], ['a', 'c', 'b'], ['c', 'a', 'b']]})
    
    prob = list(permutations(['a', 'b', 'c']))
    prob = [list(ele) for ele in prob]
    ps = pd.Series(prob)
    
    >>> df
               a
    0  [a, b, c]
    1  [a, c, b]
    2  [c, a, b]
    >>> ps
    0    [a, b, c]
    1    [a, c, b]
    2    [b, a, c]
    3    [b, c, a]
    4    [c, a, b]
    5    [c, b, a]
    dtype: object
    

    我的问题是如何在df中添加列“idx”,该列包含序列“ps”中列“a”中值的索引?期望的结果是:

    a     idx
    [a,b,c] 0
    [a,c,b] 1
    [c,a,b] 4
    

    chatgpt给了我一个答案,但当我的真实数据很大时,它的工作速度非常缓慢。

    df['idx'] = df['a'].apply(lambda x: ps[ps.apply(lambda y: y == x)].index[0])
    

    有更有效的方法吗?

    1 回复  |  直到 1 月前
        1
  •  1
  •   jezrael    1 月前

    使用 DataFrame.merge 具有 DataFrame 构造函数:

    #if possible duplicates in ps remove them
    ps = ps.drop_duplicates()
    
    df = df.merge(pd.DataFrame({'idx': ps.index, 'a':ps.values}), on='a')
    print (df)
               a  idx
    0  [a, b, c]    0
    1  [a, c, b]    1
    2  [c, a, b]    4
    

    老款pandas版本的解决方案-在之前将列表转换为元组 merge :

    df1 = ps.apply(tuple).reset_index().drop_duplicates(0)
    print (df1)
       index          0
    0      0  (a, b, c)
    1      1  (a, c, b)
    2      2  (b, a, c)
    3      3  (b, c, a)
    4      4  (c, a, b)
    5      5  (c, b, a)
    
    df = (df.merge(df1, left_on=df['a'].apply(tuple),right_on=df1[0])
           .drop(['key_0',0], axis=1))
    print (df)
               a  index
    0  [a, b, c]      0
    1  [a, c, b]      1
    2  [c, a, b]      4