df=pd.DataFrame({"a":[1,2,3,[4,5],["apple","pear"]]})
df.replace({[4,5]:4.5})
df.replace({["apple","pear"]:"apple"})
这里我得到了TypeError。我想替换特定的列表,要替换的列表和用于替换列表的对象之间没有任何规定。
答案 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']}
结果: