我想计算组中最后几个元素的扩展窗口...
df = pd.DataFrame({'B': [np.nan, np.nan, 1, 1, 2, 2, 1,1], 'A': [1, 2, 1, 2, 1, 2,1,2]})
df.groupby("A")["B"].expanding().quantile(0.5)
这给出:
1 0 NaN
2 1.0
4 1.5
6 1.0
2 1 NaN
3 1.0
5 1.5
7 1.0
我只想要每个组的最后两行。结果应该是:
1 4 1.5
6 1.0
2 5 1.5
7 1.0
我可以轻松计算出所有内容,然后得到我想要的部分。但是如果我的数据帧有 1000 个元素长并且我不想滚动整个窗口......只是最后两个“滚动”,那么这会非常慢
编辑:我修改了标题;很多人都正确回答了部分问题,但忽略了IMO的重要部分(我应该更清楚) 这里的问题是所需的时间。我可以“尾随”答案以获得最后两个;但随后它涉及计算前两个“扩展窗口”,然后丢弃这些结果。如果我的数据帧有 1000 行长,而我只需要最后几个条目的答案,那么大部分计算都会浪费时间。这是我面临的主要问题。 正如我所说: “我可以轻松地计算出所有内容,然后只需获取我想要的部分” => 通过使用 tail. 对困惑感到抱歉。 也可能使用 tail 不 涉及计算批处理,但从我所做的时间来看,它仍然似乎是这样......也许这是不正确的,这是我所做的假设。
EDIT2:我尝试过的另一个选项是在滚动中使用 min_windows 来强制它不计算组的初始部分,但这有很多陷阱,例如:-如果数组包含 NaN,则这不起作用,-if groupby 的长度不同。
编辑3: 作为一个更简单的问题和推理:我认为它是扩展/或滚动窗口的限制...假设我们有一个数组 [1,2,3,4,5] 扩展窗口是 [1], [1,2 ]、[1,2,3]、[1,2,3,4]、[1,2,3,4,5],如果我们运行最大值,我们会得到:1,2,3,4 ,5(每个数组的最大值)。但如果我只想要最后两个扩展窗口的最大值。我只需要 max[1,2,3,4] = 4 和 max[1,2,3,4,5]。直观上,我不需要计算前 3 个扩展窗口结果的最大值来获得后两个。但 Pandas 实现可能会将 max[1,2,3,4] 计算为 max[max[1,2,3],max[4]] = 4,在这种情况下,需要计算整个窗口。 .这对于分位数示例可能是相同的。可能有另一种方法可以做到这一点,但是不使用扩展...不确定...这是我无法解决的问题。
最佳答案
也许尝试使用尾部:https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.core.groupby.GroupBy.tail.html
df.groupby('A')['B'].rolling(4, min_periods=1).quantile(0.5).reset_index(level=0).groupby('A').tail(2)
Out[410]:
A B
4 1 1.5
6 1 1.0
5 2 1.5
7 2 1.0
滚动和展开类似
这个怎么样(2018 年 6 月 12 日编辑):
def last_two_quantile(row, q):
return pd.Series([row.iloc[:-1].quantile(q), row.quantile(q)])
df.groupby('A')['B'].apply(last_two_quantile, 0.5)
Out[126]:
A
1 0 1.5
1 1.0
2 0 1.5
1 1.0
Name: B, dtype: float64
如果这(或类似的东西)没有达到您想要的效果,我认为您应该提供一个真实的用例示例。
关于python - 在 pandas 中,有一种方法可以计算扩展窗口的一部分;不计算整个数组和 "tail-ing"结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752605/