2016-09-23 60 views
4


一个非常简单的示例,仅供了解。如何根据另一列中滚动函数的结果计算pandas DataFrame列的值

目标是根据另一列中滚动函数的结果计算pandas DataFrame列的值。

我有以下数据框:

import numpy as np 
import pandas as pd 

s = pd.Series([1,2,3,2,1,2,3,2,1])  
df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

df 

DataFrame start

注:我甚至不知道如何格式化的编辑#1窗口中Jupyter笔记本电脑的结果,所以我复制和粘贴图像,我请你原谅。

数据列显示观察数据;如下所述,POINTS列被初始化为0,用于收集应用于DATA列的“滚动”函数的输出。

设置窗口= 4

nwin = 4 

只是为了示例,“滚动” 函数来计算最大

现在让我用一张图来解释我需要的东西。

Algo flow

对于每次迭代,所述滚动功能计算出最大的窗口中的数据;那么最大数据相同指数在点由1

最终的结果是增加:

DataFrame end

你能帮助我的Python代码?

我真的很感谢你的帮助。
预先感谢您的宝贵时间,
吉尔伯托

附:你也可以建议如何复制和粘贴Jupyter Notebook格式的单元格到Stackoverflow编辑窗口?谢谢。

+1

复制打印的'输出(DF) '在编辑窗口中,并将其全部格式化为代码(工具栏中的“{}”按钮)。另请参见[如何制作好重现熊猫示例](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)。 – IanS

+0

“对于每次迭代,滚动函数计算窗口中数据的最大值;然后,与最大DATA相同索引处的POINT将增加1。 - 我不明白:是不是通过'(df.DATA.rolling(4).max()== df.DATA).astype(int)'增加'POINTS'?不过,它不适合你的输出示例。 –

+1

@AmiTavory,我了解它的方式,前三个滚动窗口在索引2处的最大值,因此索引2处的POINTS值增加了三倍。第四个滚动窗口不再覆盖索引2,所以算法继续运行,可以这么说。一个有趣的问题,我会说... – IanS

回答

2

IIUC由@IanS的解释(!再次感谢),你可以做

In [75]: np.array([df.DATA.rolling(4).max().shift(-i) == df.DATA for i in range(4)]).T.sum(axis=1) 
Out[75]: array([0, 0, 3, 0, 0, 0, 3, 0, 0]) 

要更新列:

In [78]: df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

In [79]: df.POINTS += np.array([df.DATA.rolling(4).max().shift(-i) == df.DATA for i in range(4)]).T.sum(axis=1) 

In [80]: df 
Out[80]: 
    DATA POINTS 
0  1  0 
1  2  0 
2  3  3 
3  2  0 
4  1  0 
5  2  0 
6  3  3 
7  2  0 
8  1  0 
+0

非常感谢@AmiTavory!我的Python知识仍然很差,但你的回答非常有帮助。 – Gilberto

+0

谢谢@IanS帮助澄清我的问题。 – Gilberto

1
import pandas as pd 

s = pd.Series([1,2,3,2,1,2,3,2,1])  
df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

df.POINTS=df.DATA.rolling(4).max().shift(-1) 
df.POINTS=(df.POINTS*(df.POINTS==df.DATA)).fillna(0) 
相关问题