Python/Pandas中位运算符的any()和all()模拟

2024-10-01 00:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,列“Category”和“Total”。可以有4个不同的类别:A、B、C、D。我将每个类别的切点值作为dict给我。我需要排除总计超过相应切点的所有条目。这很好:

cat = weekly_units['Category']
total = weekly_units['Total']
weekly_units = weekly_units[(cat == 'A') & (total <= cutpoints['A'])
                          | (cat == 'B') & (total <= cutpoints['B'])
                          | (cat == 'C') & (total <= cutpoints['C'])
                          | (cat == 'D') & (total <= cutpoints['D'])]

但我发现它又湿又不协调。 有没有办法写这样的东西?在

^{pr2}$

Tags: 数据pandas条目类别dictcattotalunits
3条回答

这是干巴巴的,简单明了:

matched = False  # or matched = pd.Series(False, index=weekly_units.index)
for cat, cutpoint in cutpoints.items()
    matched |= ((weekly_units['Category'] == cat) & (weekly_units['Total'] <= cutpoint))
weekly_units = weekly_units[matched]

注意,这跟在official advice后面的是“使用函数工具.reduce()如果您确实需要它;但是,在99%的情况下,显式for循环更具可读性。”

还有一种使用reduce()的标准库方法,但正如承诺的那样,它的可读性较差:

^{pr2}$

是的。您要找的是^{}

conditions = [(cat == k) & (total <= v) for k, v in cutpoints.items()]
weekly_units = weekly_units[np.logical_or.reduce(conditions)]

假设您的Category列实际上是CategoricalDtype,您还可以执行以下操作:

weekly_units[total <= cat.cat.rename_categories(cutpoints).astype(float)]

相关问题 更多 >