第一次滚动记录在DF中的两列之间改变(& diffs)

时间:2013-04-15 15:40:06

标签: python-2.7 pandas time-series

我的数据存储在pandas数据帧中。

规则:

_存储col1或col2中出现的第一个值。 (这里是df [“col2”] [0])。

_增加行,如果下一个数字出现在同一列中,则连续忽略它。

_第一次出现在备用栏中的值取差...

_仅在第一列更改时保留两列值的滚动记录。

       Psedo-code e.g. based on sample data (plse see below): 


                df["new"][0]=df["col2"][0]-df["col1"][4]

                  Store df["col1"][4]

                df["new"][1]=df["col2"][9]-df["col1"][4]

                   Store df["col1"][9]

                df["new"][2]=df["col2"][9]-df["col1"][11]

                       etc
                       etc
                       etc
                        .
                        .
                        .


index    col1     col2

0                   46.84
1                   46.84
2                   46.84
3                   46.84
4       44.9501 
5       44.9731 
6       45.0229 
7       45.048  
8       45.0753 
9                 45.0753
10                45.0753
11     46.84
12     45.0229
13     44.9501
14     46.75
15     46.75
16     44.9731
17                 44.9501
18                 45.0229
19                 45.0229
20                 46.75

框架中有数千行。非常感谢关于最佳方式的想法。

这是我脚本的链接:

https://www.dropbox.com/s/5od59ejprwzu6ii/algo1.py


编辑:user1827356在以下评论部分的建议。


 df['mapnl']= np.where(df['group']%2 == 0, df['result'], -df['result']) – 

我尝试使用以下行来解决此问题,以尝试否定所有其他值:

df['mapnl'] = df.apply(lambda row: row['result'] if row['group']%2 == 0 else -row['result'], axis=1)

它给出了与user1827356建议相同的结果。

1 个答案:

答案 0 :(得分:3)

这可能有所帮助

df['col'] = np.where(df.col1.isnull(), 'col2', 'col1')

df['group'] = (df.col != df.col.shift(1)).astype('int').cumsum()

df['value'] = np.where(df.col1.isnull(), df['col2'], df['col1'])

df['first'] = df.value.groupby(df.group).transform(lambda s: s.iget(0))

df
       col1     col2   col  group    value    first
0       NaN  46.8400  col2      1  46.8400  46.8400
1       NaN  46.8400  col2      1  46.8400  46.8400
2       NaN  46.8400  col2      1  46.8400  46.8400
3       NaN  46.8400  col2      1  46.8400  46.8400
4   44.9501      NaN  col1      2  44.9501  44.9501
5   44.9731      NaN  col1      2  44.9731  44.9501
6   45.0229      NaN  col1      2  45.0229  44.9501
7   45.0480      NaN  col1      2  45.0480  44.9501
8   45.0753      NaN  col1      2  45.0753  44.9501
9       NaN  45.0753  col2      3  45.0753  45.0753
10      NaN  45.0753  col2      3  45.0753  45.0753

df['first'].diff(1).groupby(df.group).first()
group
1           NaN
2       -1.8899
3        0.1252