如何在python / pandas中复制Excel COUNTIFS?

MJS*_*MJS 5 python boolean countif dataframe pandas

我想对df ['A']中的前5个值中的#进行计数,这些值<df ['A']中的当前值并且也> = df2 ['A']。我试图避免循环遍历每一行和每一列,因为我想将此应用于更大的数据集。

鉴于这种...

list1 = [[21,101],[22,110],[25,113],[24,112],[21,109],[28,108],[30,102],[26,106],[25,111],[24,110]]
df = pd.DataFrame(list1,index=pd.date_range('2000-1-1',periods=10, freq='D'), columns=list('AB'))
df2 = pd.DataFrame(df * (1-.05))
Run Code Online (Sandbox Code Playgroud)

我想返回这个(在Excel中使用COUNTIFS解决)...

在此处输入图片说明

下面的线达到了第一部分(感谢Alexander),并且Divakar和DSM也在之前(这里这里)进行了权衡。

df3 = pd.DataFrame(df.rolling(center=False,window=6).apply(lambda rollwin: sum((rollwin[:-1] < rollwin[-1]))))
Run Code Online (Sandbox Code Playgroud)

但是我无法将比较添加到df2中。请帮忙。

跟进10/27/16:

我该如何将上述lambda编写为标准函数?

16/10/28:

参见下文,从df和df2中获取col'A',我试图计算df ['A']的前5个值中有多少落在当前df2 ['A']和df ['A']之间。换句话说,从每个橙色框中有多少个落在黄色低-高范围之间?

在此处输入图片说明

更新:不同的list1数据产生不正确的df3 ...

list1 = [[21,101],[22,110],[25,113],[24,112],[21,109],[26,108],[25,102],[26,106],[25,111],[22,110]]
df = pd.DataFrame(list1,index=pd.date_range('2000-1-1',periods=10, freq='D'), columns=list('AB'))
df2 = pd.DataFrame(df * (1-.05))

df3 = pd.DataFrame(
     df.rolling(center=False,window=6).apply(
          lambda rollwin: pd.Series(rollwin[:-1]).between(rollwin[-1]*0.95,rollwin[-1]).sum()))

df
Out[9]: 
             A    B
2000-01-01  21  101
2000-01-02  22  110
2000-01-03  25  113
2000-01-04  24  112
2000-01-05  21  109
2000-01-06  26  108
2000-01-07  25  102
2000-01-08  26  106
2000-01-09  25  111
2000-01-10  22  110


df3
Out[8]: 
              A    B
2000-01-01  NaN  NaN
2000-01-02  NaN  NaN
2000-01-03  NaN  NaN
2000-01-04  NaN  NaN
2000-01-05  NaN  NaN
2000-01-06  1.0  0.0
2000-01-07  2.0  0.0
2000-01-08  3.0  1.0
2000-01-09  2.0  3.0
2000-01-10  1.0  3.0
Run Code Online (Sandbox Code Playgroud)

卓越示例(11/14):请参见下文,尝试计算蓝色框中有多少个数字介于橙色突出显示的范围之间。

在此处输入图片说明

Dic*_*ter 2

list1 = [[21,50,101],[22,52,110],[25,49,113],[24,49,112],[21,55,109],[28,54,108],[30,57,102],[26,56,106],[25,58,111],[24,60,110]]
df = pd.DataFrame(list1,index=pd.date_range('2000-1-1',periods=10, freq='D'), columns=list('ABC'))

print df
Run Code Online (Sandbox Code Playgroud)

我相信这与您的新屏幕截图“给定数据”相匹配。

             A   B    C
2000-01-01  21  50  101
2000-01-02  22  52  110
2000-01-03  25  49  113
2000-01-04  24  49  112
2000-01-05  21  55  109
2000-01-06  28  54  108
2000-01-07  30  57  102
2000-01-08  26  56  106
2000-01-09  25  58  111
2000-01-10  24  60  110
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

和相同的功能:

print pd.DataFrame(
           df.rolling(center=False,window=6).
              apply(lambda rollwin: pd.Series(rollwin[:-1]).
                   between(rollwin[-1]*0.95,rollwin[-1]).sum()))
Run Code Online (Sandbox Code Playgroud)

给出您想要的输出“期望的结果”:

             A   B   C
2000-01-01 nan nan nan
2000-01-02 nan nan nan
2000-01-03 nan nan nan
2000-01-04 nan nan nan
2000-01-05 nan nan nan
2000-01-06   0   1   0
2000-01-07   0   1   0
2000-01-08   1   2   1
2000-01-09   1   2   3
2000-01-10   0   2   3
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述