我正在玩几个想法,根据两个标准计算独特的文字。我以为Sumproduct会为我做这件事,但它似乎没有用。我可能需要某种VBA脚本。基本上,我想做以下几点。
1)查看ColumnB中的所有内容以及是否符合条件
2)查看ColumnW中的所有内容以及是否符合条件
3)计算ColumnF中的唯一文本。
几乎是这样的:
= COUNTIFS(W:W,A1,B:B,B1)
然后,根据结果,计算ColumnF中的唯一身份
我认为这应该很简单,但事实证明这很难!
答案 0 :(得分:1)
您可以使用standard SUMPRODUCT-based pseudo-COUNTUNIQUE,但需要通过在分子中添加条件以及在Demononator中添加反向条件来修改它;后者以避免#DIV/0!
错误。这将生成伪COUNTIFSUNIQUE。
=SUMPRODUCT(SIGN((B2:B20="bee")*(W2:W20="double-you"))/
(COUNTIFS(B2:B20, "bee", W2:W20, "double-you", F2:F20, F2:F20)+(B2:B20<>"bee")+(W2:W20<>"double-you")))
答案 1 :(得分:1)
另一种解决方案是从这里调整公式:Count Unique Text Values in a Range。
如果F:F
和F:F
同时保持Crit1
,则修改它以匹配Crit2
,而不是"No Match"
。也就是说,
IF((B:B="Crit1")*(W:W="Crit2"),F:F,"No Match")
然后你对该阵列进行唯一计数。
=SUMPRODUCT(--(FREQUENCY(MATCH(IF((B:B="Crit1")*(W:W="Crit2"),F:F,"No Match"),
IF((B:B="Crit1")*(W:W="Crit2"),F:F,"No Match"),0),
ROW(F:F)-ROW($F$1)+1)>0))
-NOT(PRODUCT((B:B="Crit1")*(W:W="Crit2")))
最后的-NOT(PRODUCT(...))
是减去"No Match"
条目的唯一计数(如果它存在的话)(如果你知道总是会有-1
,那么这可以被def f(x, var):
tup_list = list(x)
for t in tup_list:
if t[0] == var:
return t[1]
return np.NaN
df.columns = ['col']
for var in ['A', '-A', 'B', '-B', 'C', '-C', 'D', '-D']:
df[var] = df['col'].apply(lambda x: f(x, var))
df2 = df.loc[(df['A'] > 3) & ((df['-A'] < 3) & (df['B'] is not np.NaN)) & (df['-C'] > 2)]
替换不符合这两个标准。)
请注意,这是一个数组公式,必须使用 Ctrl + Shift + Enter 输入。