Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python/pandas中复制excel COUNTIFS?_Python_Pandas_Dataframe_Boolean_Countif - Fatal编程技术网

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

如何在python/pandas中复制excel COUNTIFS?,python,pandas,dataframe,boolean,countif,Python,Pandas,Dataframe,Boolean,Countif,我想得到df['a']中前5个值的#计数,它们也=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'), c

我想得到df['a']中前5个值的#计数,它们也=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))
我想返回这个(用Excel和COUNTIFS解决)

下面这一行完成了第一部分(感谢Alexander),Divakar和DSM也在前面进行了权衡(和)

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

但是

看到你的上下限之间有一个逻辑关系,值和值-5%。那么这也许就是你想要的

    df3 = pd.DataFrame(
         df.rolling(center=False,window=6).apply(
            lambda rollwin: sum(np.logical_and(
                                    rollwin[-1]*0.95 <= rollwin[:-1]
                                   ,rollwin[:-1] < rollwin[-1]) 
                                )))
我相信这符合你的新屏幕截图“给定数据”

同样的功能:

print pd.DataFrame(
           df.rolling(center=False,window=6).
              apply(lambda rollwin: pd.Series(rollwin[:-1]).
                   between(rollwin[-1]*0.95,rollwin[-1]).sum()))
给出所需输出“所需结果”:


您的
df2
不可复制<代码>df_数据未在此处定义。修复了Psidom。谢谢。我们能整理一下这个问题并回答吗?对不起,有什么我没做的吗?我对你的两个答案都投了赞成票,并选择了第二个,因为它更简洁,让其他人看。回答得很好,非常感谢您的时间。另一方面,我发现关于操作df.rolling()对象的文档没有其他许多主题那么丰富。将下面的0.95替换为相同滚动数据的另一个派生版本将非常有用。谢谢Dickster,非常感谢您的输入。当我正在研究你的解决方案时,我在上面的问题中添加了一些颜色-可能问得不够清楚。效果很好,再次感谢。我相信.between()方法优于第一种方法。我要问一个新问题作为后续问题。冷静地告诉我这一点,并相信其他线程上实现的功能。嗨,迪克斯特,在进一步使用后,似乎有什么问题。当我用list1=[21101]、[22110]、[25113]、[24112]、[21109]、[26108]、[25102]、[26106]、[25111]、[22110]替换原始的“list1”时,带有Series.between()解决方案的输出似乎不正确。你能看一下吗?我看不出使用新数据的问题。你认为什么是错的?它起作用了。非常感谢你。在inclusive=True/False之间切换很重要。
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))


window = 6
results = []
for i in range (len(df)-window+1):
    slice_df1 = df.iloc[i:i + window]
    slice_df2 = df2.iloc[i:i + window]
    compare1 = slice_df1['A'].iloc[-1]
    compare2 = slice_df2['A'].iloc[-1]
    a= slice_df1.iloc[:-1]['A'].between(compare2,compare1)  # series have a between metho
    results.append(a.sum())

df_res =  pd.DataFrame(data = results , index = df.index[window-1:] , columns = ['countifs'])
df_res = df_res.reindex(df.index,fill_value=0.0)
print df_res

which yields:

            countifs
2000-01-01    0.0000
2000-01-02    0.0000
2000-01-03    0.0000
2000-01-04    0.0000
2000-01-05    0.0000
2000-01-06    0.0000
2000-01-07    0.0000
2000-01-08    1.0000
2000-01-09    1.0000
2000-01-10    0.0000
    df3 = pd.DataFrame(
         df.rolling(center=False,window=6).apply(
            lambda rollwin: sum(np.logical_and(
                                    rollwin[-1]*0.95 <= rollwin[:-1]
                                   ,rollwin[:-1] < rollwin[-1]) 
                                )))
df3 = pd.DataFrame(
     df.rolling(center=False,window=6).apply(
          lambda rollwin: pd.Series(rollwin[:-1]).between(rollwin[-1]*0.95,rollwin[-1]).sum()))
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
             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
print pd.DataFrame(
           df.rolling(center=False,window=6).
              apply(lambda rollwin: pd.Series(rollwin[:-1]).
                   between(rollwin[-1]*0.95,rollwin[-1]).sum()))
             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