【发布时间】:2016-10-26 20:44:50
【问题描述】:
我想计算 df['A'] 中前 5 个值中的 # 个,它们是
鉴于此...
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 之前也参与过(here 和 here)。
df3 = pd.DataFrame(df.rolling(center=False,window=6).apply(lambda rollwin: sum((rollwin[:-1] < rollwin[-1]))))
但我无法将比较添加到 df2。请帮忙。
2016 年 10 月 27 日跟进:
如何将上面的 lambda 编写为标准函数?
16 年 10 月 28 日:
见下文,从 df 和 df2 中获取 col 'A',我试图计算 df['A'] 的前 5 个值中有多少落在当前 df2['A'] 和 df['一种']。换句话说,每个橙色框有多少个落在黄色低-高范围之间?
更新:不同的 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
EXCEL 示例 (11/14):见下文,尝试计算蓝色框中有多少数字落在以橙色突出显示的范围之间。
【问题讨论】:
-
您的
df2不可重现。df_data此处未定义。 -
固定 Psidom。谢谢。
-
我们会整理并回答这个问题吗?
-
抱歉有什么我没有做的吗?我赞成您的两个答案并选择了第二个,因为它更简洁供其他人查看。很好的答案,非常感谢您的宝贵时间。
-
在单独的说明中,我没有发现有关操作 df.rolling() 对象的文档与许多其他主题一样充实。将下面的 0.95 替换为相同滚动数据的另一个推导会很有用。
标签: python pandas dataframe boolean countif