代码之家  ›  专栏  ›  技术社区  ›  Mohamed Thasin ah

如何在序列中替换列表中的元素

  •  2
  • Mohamed Thasin ah  · 技术社区  · 6 年前

    我有一个如下的数据框,

    DF1

             col1
    0          10
    1  [5, 8, 11]
    2          15
    3          12
    4          13
    5          33
    6    [12, 19]
    

    生成此的代码 df1 :

    df1 = pd.DataFrame({"col1":[10,[5,8,11],15,12,13,33,[12,19]]})
    

    DF2

       col1  col2
    0    12     1
    1    10     2
    2     5     3
    3    11    10
    4     7     5
    5    13     4
    6     8     7
    

    生成此的代码 df2 :

    df2 = pd.DataFrame({"col1":[12,10,5,11,7,13,8],"col2":[1,2,3,10,5,4,7]})
    

    我想替换中的元素 DF1 具有 小精灵 价值观。

    如果序列值包含非列表元素, 我可以用 map

    df1['res'] = df1['col1'].map(df2.set_index('col1')["col2"].to_dict())
    

    但现在这个系列包含了列表和标量的混合。 如何有效地替换列表中的元素和序列中的标量值。

    预期产量

             col1     res
    0          10        2
    1  [5, 8, 11] [3,7,10]
    2          15       15
    3          12        1
    4          13        4
    5          33       33
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   jpp    6 年前

    你的系列是数据类型的 object ,因为它包含 int list 物体。这对熊猫来说是低效的,意味着矢量化的解决方案是不可能的。

    您可以创建映射字典并使用 pd.Series.apply . 解释 列表 对象,可以捕获 TypeError . 对于列表,您会遇到此特定错误,因为它们不可哈希,因此不能用作字典键。

    d = df2.set_index('col1')['col2'].to_dict()
    
    def mapvals(x):
        try:
            return d.get(x, x)
        except TypeError:
            return [d.get(i, i) for i in x]
    
    df1['res'] = df1['col1'].apply(mapvals)
    
    print(df1)
    
             col1         res
    0          10           2
    1  [5, 8, 11]  [3, 7, 10]
    2          15          15
    3          12           1
    4          13           4
    5          33          33
    6    [12, 19]     [1, 19]