我的数据存储在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建议相同的结果。
答案 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