【问题标题】:Replace list element in pandas dataframe替换熊猫数据框中的列表元素
【发布时间】:2018-10-23 16:11:10
【问题描述】:
df=pd.DataFrame({"a":[1,2,3,[4,5],["apple","pear"]]})
df.replace({[4,5]:4.5})
df.replace({["apple","pear"]:"apple"})

这里我得到了 TypeError。我要替换特定的列表,要替换的列表和用来替换列表的对象之间没有任何规定。

【问题讨论】:

    标签: python list pandas dataframe replace


    【解决方案1】:

    我遇到了类似的问题,因为我列在列中的地方需要标准化。首先,我尝试将列表作为键,将标准词作为值,这当然失败了。因此,我创建了一个函数,将列表中的值扩展为键,并将标准词分配为所有它们的值:

    def list_to_dict(cities):
        new_dict = {}
        for key in cities:
            value = cities[key]
            for item in value:
                new_dict[item] = key
        
        return new_dict
    

    有了这个,我必须清理这个旨在用西班牙语表示墨西哥城的单词列表(当然我的集合更大,用于更多地方,但这是一个说明性的子组):

    ciudades = list_to_dict({'Ciudad De Mexico' : ['Ciudad De México', 'Cuajimalpa De Morelos', 'Mexicocity', 'Ciudad De  Mexico', 'Miguel Hidalgo, Cdmx', 'Df', 'Cmx', 'Ciudad De M', 'Cdmx', 'Ciudad De M?Xico', 'C.D. M.X,', 'Mx-Cdm', 'Cuidad De Mexico', 'Dif', 'D.F.', 'D.F', 'DF', 'Distrito', 'Mexico City', 'Coyoacan', 'Mx-Cdm', 'Cdmex', 'Mx-Dif', 'Mexico Df', 'Ciudad_De_M']}
    

    导致:

    【讨论】:

      【解决方案2】:

      有一种方法可以使用astype,即使它有效,但我仍然强烈建议您使用cold's answer.

      df.astype(str).replace({'[4, 5]':4.5,"['apple', 'pear']":"apple"})
      Out[159]: 
             a
      0      1
      1      2
      2      3
      3    4.5
      4  apple
      

      【讨论】:

      • 是的......我想过这个,但错误的范围太大(引用问题等)。
      • 最后,它将所有项目转换为 str,甚至是数字项目;-)
      • @cᴏʟᴅsᴘᴇᴇᴅ 是的,这就是为什么我认为您的回答是此类问题的正确方法
      【解决方案3】:

      这不是一个微不足道的问题,因为 DataFrame 并非设计用于处理可变对象,如列表、集合或字典。

      您可以确定匹配的索引并相应地替换。

      m = [v == [4, 5] for v in df['a']] 
      df.loc[m, 'a'] = 4.5
      
      df
                     a
      0              1
      1              2
      2              3
      3            4.5
      4  [apple, pear]
      

      ['apple', 'pair'] 的过程类似。如果你愿意,你可以从中形成一个函数:

      def replace(df, col, key, val):
          m = [v == key for v in df[col]]
          df.loc[m, col] = val
      
      replace(df, 'a', [4, 5], 4.5)
      replace(df, 'a', ['apple', 'pear'], 'apple')
      
      df
             a
      0      1
      1      2
      2      3
      3    4.5
      4  apple
      

      注意:该功能就地工作。

      【讨论】:

        猜你喜欢
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 2015-10-12
        • 2022-06-24
        • 2022-01-11
        • 2017-06-08
        相关资源
        最近更新 更多