[英]How to append value to list in single cell in Pandas dataframe based on condition
[英]How to delete row in pandas dataframe based on condition if string is found in cell value of type list?
我一直在努力解决以下问题,这些问题实际上听起来很简单,但似乎无法弄清楚,我确信它在堆栈跟踪中非常明显,但我只是愚蠢。
我只是有一个 pandas dataframe 看起来像这样:
并希望在 jpgs 单元格值(列表)中删除包含值“123.jpg”的行。 所以通常我会得到最终的 dataframe 只有索引 1 和 3 的行。
但是我试了很多方法都没有用。
例如:
df = df["123.jpg" not in df.jpgs]
或者
df = df[df.jpgs.tolist().count("123.jpg") == 0]
给出错误 KeyError: True:
df = df[df['jpgs'].str.contains('123.jpg') == False]
返回一个空的 dataframe:
df = df[df.jpgs.count("123.jpg") == 0]
和
df = df.drop(df["123.jpg" in df.jpgs].index)
给出 KeyError: False:
如果需要,这是我的全部代码,如果有人能帮助我回答我做错了什么,我将不胜感激:(。谢谢!!
import pandas as pd
df = pd.DataFrame(columns=["person_id", "jpgs"])
id = 1
pair1 = ["123.jpg", "124.jpg"]
pair2 = ["125.jpg", "300.jpg"]
pair3 = ["500.jpg", "123.jpg"]
pair4 = ["111.jpg", "122.jpg"]
row1 = {'person_id': id, 'jpgs': pair1}
row2 = {'person_id': id, 'jpgs': pair2}
row3 = {'person_id': id, 'jpgs': pair3}
row4 = {'person_id': id, 'jpgs': pair4}
df = df.append(row1, ignore_index=True)
df = df.append(row2, ignore_index=True)
df = df.append(row3, ignore_index=True)
df = df.append(row4, ignore_index=True)
print(df)
#df = df["123.jpg" not in df.jpgs]
#df = df[df['jpgs'].str.contains('123.jpg') == False]
#df = df[df.jpgs.tolist().count("123.jpg") == 0]
df = df.drop(df["123.jpg" in df.jpgs].index)
print("\n Final df")
print(df)
由于您在列表列上进行过滤,因此应用 lambda 可能是最简单的:
df.loc[df.jpgs.apply(lambda x: "123.jpg" not in x)]
对您的尝试的快速评论:
在df = df.drop(df["123.jpg" in df.jpgs].index)
您正在检查列中是否包含确切的值 "123.jpg" ( "123.jpg" in df.jpgs
)而不是在任何列表中,这不是您想要的。
在df = df[df['jpgs'].str.contains('123.jpg') == False]
中,方向正确,但您缺少regex=False
关键字,如 Ibrahim 的回答所示。
df[df.jpgs.count("123.jpg") == 0]
在这里也不适用,因为count
返回系列中非 NaN 值的总数。
对于str.contains
一个,这是如何完成的
df[df.jpgs.str.contains("123.jpg", regex=False)]
你可以试试这个:
mask = df.jpgs.apply(lambda x: '123.jpg' not in x)
df = df[mask]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.