替换熊猫数据框中的列表元素

Posted

技术标签:

【中文标题】替换熊猫数据框中的列表元素【英文标题】: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。我要替换特定的列表,要替换的列表和用来替换列表的对象之间没有任何规定。

【问题讨论】:

【参考方案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

注意:该功能就地工作。

【讨论】:

以上是关于替换熊猫数据框中的列表元素的主要内容,如果未能解决你的问题,请参考以下文章

替换熊猫数据框中部分匹配字符串的列名

如何用熊猫数据框中的范围替换列值

使用字典替换熊猫数据框中的单词

Python - 替换熊猫数据框中的负无穷大值[重复]

如何为熊猫数据框中的每一行映射/替换列中的多个值

如何从熊猫数据框中的列中删除字符串值