我有一个 pandas DataFrame,我想使用解析为 bool 值的自定义函数按组对其进行汇总。
考虑以下数据。 df
描述了 4 个人,以及每个人他们喜欢的水果。
import numpy as np
import pandas as pd
df = pd.DataFrame({
"name": ["danny", "danny", "danny", "monica", "monica", "monica", "fred", "fred", "sam", "sam"],
"fruit": ["apricot", "apple", "orange", "apricot", "banana", "watermelon", "apple", "apricot", "apricot", "peach"]
})
print(df)
## name fruit
## 0 danny apricot
## 1 danny apple
## 2 danny orange
## 3 monica apricot
## 4 monica banana
## 5 monica watermelon
## 6 fred apple
## 7 fred apricot
## 8 sam apricot
## 9 sam peach
我想总结此表,以找到喜欢两者 杏
和 苹果的人
。换句话说,我的所需输出如下表
# desired output
## name fruit
## 0 danny True
## 1 monica False
## 2 fred True
## 3 sam False
我的尝试
我首先定义了一个函数,用于搜索目标列表中是否存在字符串:
def is_needle_in_haystack(needle, haystack):
return all(x in haystack for x in needle)
is_needle_in_haystack()
工作的示例:
is_needle_in_haystack(["zebra", "lion"], ["whale", "lion", "dog"])
# False
is_needle_in_haystack(["rabbit", "cat"], ["hamster", "cat", "monkey", "rabbit"])
# True
现在我在按名称
对df
进行分组时使用了is_needle_in_haystack()
:
target_fruits = ["apricot", "apple"]
df.groupby(df["name"]).agg({"fruit": lambda x: is_needle_in_haystack(target_fruits, x)})
那为什么我会得到以下输出,这显然不符合预期?
## fruit
## name
## danny False
## fred False
## monica False
## sam False
我的代码做错了什么?
最佳答案
问题在于,当在 .agg
中调用时,haystack
是一个系列。 ,更改为:
def is_needle_in_haystack(needle, haystack):
return all(x in set(haystack) for x in needle)
target_fruits = ["apricot", "apple"]
res = df.groupby(df["name"]).agg({"fruit": lambda x: is_needle_in_haystack(target_fruits, x)})
print(res)
输出
fruit
name
danny True
fred True
monica False
sam False
Series 的 in
运算符返回 False
,例如:
"hamster" in pd.Series(["hamster", "cat", "monkey", "rabbit"])
# False
关于python - 使用自定义函数按组汇总 pandas DataFrame 会导致错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73094512/