0

我的数据存储在熊猫数据框中。

规则:

_存储出现在 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 的建议相同。

4

1 回答 1

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
于 2013-04-15T19:23:23.190 回答