首页 > 解决方案 > 在 Python 中以交替方式从两个数据框列中提取值

问题描述

我有一个包含 2 列的日期时间索引数据框。我正在尝试创建第三列df['eventv2'] = ...,其中包含以另一种方式从这 2 列中提取的值(以红色圈出):

在此处输入图像描述

我试图用 做一些填充ffill(),得到最后一个非nanlast_valid_index(),但都没有成功。我怀疑我应该使用一个函数,但我没有这样的高级经验。通过覆盖记录最后一列位置的变量,我可以通过逐行迭代的循环来实现所需的结果for,但是迭代速度太慢,我想利用数据帧操作。

标签: pythondataframe

解决方案


该过程的流程是 1) 在行级别删除 NA 行,2) 创建要检索的列号列表。例如,从第一列开始,[1,2,1,21,...] 如果它以 2 开头,则创建 [2,1,2,1,2...] 3) 将该列表合并到原始数据中框架; 4)与4)循环处理(如果要取回的值为NA,则不要将[1,2,1,2...]的计数器值提前

df.dropna(axis=0, how='all', inplace=True)
df.reset_index(drop=True, inplace=True)
df['eventv2'] = 0
condition = [1,2]*len(df)
# if 2 start
# condition = [2,1]*len(df)
df = pd.concat([df, pd.Series(condition)], axis=1)
global C
C = 0
for i in range(len(df)):
    if condition[C] == 1:
        if np.isnan(df.loc[i, 'buyv2']):
            df.loc[i,'eventv2'] = np.NaN
        else:
            df.loc[i,'eventv2'] = df.loc[i, 'buyv2']
            C += 1
    elif condition[C] == 2:
        if np.isnan(df.loc[i, 'sellv2']):
            df.loc[i,'eventv2'] = np.NaN
        else:
            df.loc[i,'eventv2'] = df.loc[i, 'sellv2']
            C += 1
df
    buyv2   sellv2  eventv2 0
0   -0.000160   NaN -0.000160   1
1   -3.504600   -3.504830   -3.504830   2
2   -0.000153   -0.000153   -0.000153   1
3   NaN 0.000140    0.000140    2
4   -1.178410   NaN -1.178410   1
5   -0.000291   NaN NaN 2
6   -9.676030   -9.676030   -9.676030   1
7   -2.729510   NaN -2.729510   2
8   NaN -0.000150   -0.000150   1
9   -7.571970   NaN -7.571970   2
10  NaN -0.000224   -0.000224   1

推荐阅读