我有一个pd.DataFrame
,它可能看起来像这样
data = {"col_x": ["1234", "5678", "9876", "1111"],
"col_y": ["1234", "2222", "3333", "1111"],
"col_grp": [pd.NA, ["5678", "9999"], ["9876", "5555", "1222"], pd.NA]}
df = pd.DataFrame(data)
字符串
我想做另一列valid
来检查col_x
是否等于col_y
或col_x
是否在col_grp
中。
我尝试与
def check_validity(row):
if row["col_x"] == row["col_y"]:
return True
if pd.notnull(row["col_grp"]):
if isinstance(row["col_grp"], list):
return row["col_x"] in row["col_grp"]
else:
return row["col_x"] == row["col_grp"]
return False
df["valid"] = df.apply(lambda row: check_validity(row), axis=1)
型
但我得到
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
型
我知道list
可能不应该在这样的pd.DataFrame
中,所以我提前道歉。
有人能帮帮我吗?
2条答案
按热度按时间jvidinwx1#
不要使用
apply
,而是使用一个更有效的列表解析:字符串
如果必须使用
apply
:型
输出(带有一些额外的行):
型
klh5stk12#
字符串
问题出在null检查上。如果你给予一个列表,而不是一个布尔值,那么pd.notnull返回一个布尔值列表。你可以通过首先检查单元格是否包含列表来解决这个问题。此外,lambda函数的使用是不正确的,你可以直接给予函数。