基于pandas DataFrame列条件删除指定行列表列的末尾元素
错误原因
你两次尝试的代码都存在两个问题:
- 用到了
df.loc[筛选条件]['Images']这类链式索引写法,pandas在该场景下会返回原始数据的副本而非视图,对副本做的所有修改都不会同步到原DataFrame - 第二个写法中
Series.pop()是对整个Series对象弹出最后一行元素,不是对每行存储的列表做弹出操作,完全不符合你的需求
正确实现方案
方法1:apply自定义处理(兼容性最好)
直接通过loc同时指定目标行和列,对每行的列表做切片去掉最后一个元素:
df.loc[df['Type'] == 'A', 'Images'] = df.loc[df['Type'] == 'A', 'Images'].apply(lambda x: x[:-1])
方法2:pandas列表访问器(写法更简洁)
如果你的pandas版本支持列表元素的str访问器,可以直接用更短的写法:
df.loc[df['Type'] == 'A', 'Images'] = df.loc[df['Type'] == 'A', 'Images'].str[:-1]
两种方法运行后,所有Type为A的行Images列都会去掉最后一个元素image3,其余行保持原样,完全符合预期结果。
内容的提问来源于stack exchange,提问作者Simeon Simeonov
相关产品推荐
相关产品推荐

