移除Pandas DataFrame同行列匹配的列表元素
解决方法
直接用Pandas的字符串处理结合apply就能搞定,步骤逻辑很简单:
- 先把
similar_ids列的空值填充为空字符串,避免后续拆分报错 - 对每行数据做三件事:
- 把
similar_ids按,拆分成单个元素的列表 - 过滤掉列表里和当前行
ID相同的值(注意统一类型,要么把ID转成字符串,要么把列表元素转成整数) - 把过滤后的列表再用
,拼接回字符串,空列表就返回空字符串
- 把
代码示例
假设你的DataFrame叫df,直接运行以下代码:
import pandas as pd # 构造你给的示例数据 data = { "ID": [1, 2, 3, 4, 5], "similar_ids": ["1, 234, 3215", "2, 52, 1", "49, 3", "4", None] } df = pd.DataFrame(data) # 自定义处理函数 def clean_similar_ids(row): # 处理空值情况 if pd.isna(row["similar_ids"]): return "" # 拆分字符串并转成整数列表 id_list = [int(item.strip()) for item in row["similar_ids"].split(",")] # 过滤掉和当前ID一致的元素,再转回字符串拼接 filtered = [str(num) for num in id_list if num != row["ID"]] return ", ".join(filtered) # 应用到列上 df["similar_ids"] = df.apply(clean_similar_ids, axis=1) print(df)
运行结果
执行后就能得到你想要的格式:
ID similar_ids 0 1 234, 3215 1 2 52, 1 2 3 49 3 4 4 5
如果想更简洁,也可以用链式操作省掉自定义函数:
df["similar_ids"] = ( df["similar_ids"] .fillna("") .str.split(", ") .apply(lambda x: [item for item in x if item != str(df.loc[x.name, "ID"])]) .str.join(", ") )
这个方法直接把ID转成字符串和拆分后的元素对比,逻辑更紧凑。
内容的提问来源于stack exchange,提问作者youtube
相关产品推荐
相关产品推荐

