python - 在 pandas 中,有一种方法可以计算扩展窗口的一部分;不计算整个数组和 "tail-ing"结果

标签 python pandas

我想计算组中最后几个元素的扩展窗口...

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/

相关文章:

python - 如何计算文本文件中具有指定值的行数?

python - Python Tkinter 中.xxxxxxx 的含义是什么

python - 值错误: could not convert string to float: '1,141'

python - 如何将系列与数据框合并并保留双方数据

python - 如何将日期格式字符串转换为 bool True 并将其他格式转换为 False?

python - 使用 Python 插入 MongoDB 的编码问题

Python-docx 提取的缺少单词的字符串

python - 在 mlab 中反转颜色图

python - 通过追加 pandas 中不同数据帧的列来创建列

python - forwardfill结合python pandas中的计算(方法='ffill' * xyz)