Python/API中位运算符的any()和all()类似物
我有一个包含“Category”和“Total”列的熊猫数据框架。可以有4个不同的类别:A、B、C、D。我被指定为每个类别的切点值。我需要排除总数超过相应切点的所有条目。这很好:Python/API中位运算符的any()和all()类似物,python,pandas,numpy,bitwise-operators,Python,Pandas,Numpy,Bitwise Operators,我有一个包含“Category”和“Total”列的熊猫数据框架。可以有4个不同的类别:A、B、C、D。我被指定为每个类别的切点值。我需要排除总数超过相应切点的所有条目。这很好: cat = weekly_units['Category'] total = weekly_units['Total'] weekly_units = weekly_units[(cat == 'A') & (total <= cutpoints['A'])
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'])]
cat=每周单位['Category']
总计=每周单位['total']
每周单位=每周单位[(cat='A')&(总计Yes)。您正在寻找的是:
conditions=[(cat==k)&(total假设您的Category
列实际上是categorialdType
,您还可以执行以下操作:
weekly_units[total <= cat.cat.rename_categories(cutpoints).astype(float)]
weekly_units[total
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]
我喜欢不使用reduce和编写每周单位['Category']
和每周单位['Total']
明确,所以我接受你的答案。因为在原始代码中,我需要匹配
与其他条件相结合,所以我将编写单独的内部函数来计算匹配
使用运算符与numpy.logical\u或?@SashaTsukanov,你比我快吗在括号中!我认为它们是每个(in)相等测试所必需的,但不是整个表达式所必需的。要回答您关于\uuuu或
的问题,Python将
或运算符转换为对pd.Series.\uu或
的调用,其中的代码调用运算符。或(与运算符相同。\uuuuu或\uuuuu
)使用NDAREX用于这两个系列。<代码>运算符。Or> <代码>在NDAREX上使用Python < Cord> >代码> >运算符,将它们传递给<代码> NP.NDAREX.Y.O.Org> 。我不确定代码“> NP.NDARRA.O.O.O.O.<代码>与<代码> NP.LogiLogi或有关,但它们应该做大致相同的事情。我启动了没有PAR的脚本。我还有一个问题。首先你把匹配的赋值给假,然后它变成一个面具状的序列,每个周单位行包含一个布尔值。这是因为numpy广播吗?@SashaTsukanov最初的假是t与标量和向量/序列之间的大多数numpy或pandas操作类似,标量会自动用于序列的所有元素。我同意代码将匹配的从标量提升到序列有点不一致。另一方面,这避免了在第一次循环中必须添加特殊代码(某些reduce()
自动处理)。另一种方法是使用matched=pd.Series(False,index=weekly\u units.index)初始化
。仍在考虑reduce
在这里的使用是否值得。GvR告诉我们在几乎任何情况下都要避免reduce
,但在这种情况下,我想这并不是很糟糕。@SashaTsukanov。小心,这不是Python。这是。因此,我不知道GvR对特定numpy
函数的看法。是的,我注意到了di无所谓。我也不知道。@SashaTsukanov,在我看来,如果你使用的是pandas
,你应该完全开放地使用numpy
函数,如果它们有用的话,因为pandas
在内部依赖于numpy
。听起来很合理。在我尝试将其应用到我的原始代码后,结果是最简单的不要和别人的答案比较
weekly_units[total <= cat.cat.rename_categories(cutpoints).astype(float)]
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]
import functools, operator
matched = functools.reduce(
operator.__or__, # or lambda x, y: x | y
(
(weekly_units['Category'] == cat) & (weekly_units['Total'] <= cut)
for cat, cut in cutpoints.items()
)
)
weekly_units = weekly_units[matched]