如何替换Pandas DataFrame列表列中的指定元素?
问题:替换DataFrame列表列中的指定元素
现有如下Pandas DataFrame:
import numpy as np import pandas as pd df = pd.DataFrame({'store':range(1,4), 'food':[['fish', 'apple'], ['orange', 'water'], ['egg', 'fish']]})
输出结构:
store food 0 1 [fish, apple] 1 2 [orange, water] 2 3 [egg, fish]
希望将其中所有的fish替换为milk,得到目标DataFrame:
store food 0 1 [milk, apple] 1 2 [orange, water] 2 3 [egg, milk]
尝试使用for循环实现,但结果得到扁平列表,不符合预期:
food1 = [] for i in range(df.shape[0]): for j in range(len(df['food'][0])): if df['food'][i][j] == 'fish': food1.append('milk') else: food1.append(df['food'][i][j]) food1 # 输出:['milk', 'apple', 'orange', 'water', 'egg', 'milk']
正确实现方法
方法1:调整循环逻辑,保留子列表结构
原循环的问题是直接把所有元素追加到同一个大列表,没有为每一行创建独立的子列表。修改后:
food1 = [] for lst in df['food']: new_lst = [] for item in lst: new_lst.append('milk' if item == 'fish' else item) food1.append(new_lst) # 更新DataFrame df['food'] = food1 print(df)
输出:
store food 0 1 [milk, apple] 1 2 [orange, water] 2 3 [egg, milk]
方法2:使用apply结合列表推导式(更简洁)
利用Pandas的apply方法对每一行的列表批量处理:
df['food'] = df['food'].apply(lambda lst: ['milk' if x == 'fish' else x for x in lst]) print(df)
输出结果与目标一致。
方法3:直接用列表推导式生成新列
通过嵌套列表推导式直接生成替换后的列数据:
df['food'] = [['milk' if x == 'fish' else x for x in lst] for lst in df['food']] print(df)
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

