替换pandas数据帧中的列表元素

时间:2018-05-14 03:52:41

标签: python list pandas dataframe replace

df=pd.DataFrame({"a":[1,2,3,[4,5],["apple","pear"]]})
df.replace({[4,5]:4.5})
df.replace({["apple","pear"]:"apple"})

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

3 个答案:

答案 0 :(得分:2)

是一个微不足道的问题,因为DataFrames不适用于列表,集合或dicts等可变对象。

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

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

注意:该功能可以就地工作。

答案 1 :(得分: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

答案 2 :(得分:0)

我有一个类似的问题,因为我在列上列出的位置需要进行标准化。首先,我尝试给出一个列表作为键,并给出标准单词作为值,这当然失败了。因此,我做了一个函数来扩展列表上的值作为键,并为所有这些键分配标准单词作为值:

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']}

结果:

result