python - 在 Python 中以交替方式从两个数据框列中提取值
问题描述
我有一个包含 2 列的日期时间索引数据框。我正在尝试创建第三列df['eventv2'] = ...
,其中包含以另一种方式从这 2 列中提取的值(以红色圈出):
我试图用 做一些填充ffill()
,得到最后一个非nan
用last_valid_index()
,但都没有成功。我怀疑我应该使用一个函数,但我没有这样的高级经验。通过覆盖记录最后一列位置的变量,我可以通过逐行迭代的循环来实现所需的结果for
,但是迭代速度太慢,我想利用数据帧操作。
解决方案
该过程的流程是 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
推荐阅读
- jquery - 谷歌标签管理器导致 Vimeo 在播放和暂停时出现错误 addClass / removeClass
- python - 如何将多个变量(11 个数值变量)聚集到不同的桶中?
- scala - 在 withColumn 子句中执行 Spark sql 查询是 Spark Scala
- javascript - 外部脚本在 html 文件中不起作用,请问做错了什么
- oracle - 使用 Cloud Shell 导出数据泵
- python - 概率混淆
- python - 蟒蛇熊猫任务
- apollo-server - TypeGraphQL + Apollo codegen 构建解析器和查询失败
- html - 如何以角度固定选择选项的高度
- azure-pipelines - 无法为 Azure Analysis Services 角色成员指定 ID