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):请参见下文,尝试计算蓝色框中有多少个数字介于橙色突出显示的范围之间。
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)
归档时间: |
|
查看次数: |
2241 次 |
最近记录: |