为了账号安全,请及时绑定邮箱和手机立即绑定

从主数据帧中选择特定的数据切片,条件是主数据帧列中的值

从主数据帧中选择特定的数据切片,条件是主数据帧列中的值

紫衣仙女 2022-08-25 15:41:38
我有一个主数据机(df),一个带有日期列(非索引),一个带有值的列“VXX_Full”和一个“信号”列。我想循环访问信号列,每当它是1时,我想捕获“VXX_Full”列的切片(之前20行,之后40行),并创建一个包含所有切片的新数据帧。我希望新数据帧的列名是原始数据帧的行号。VXX_signal = pd.DataFrame(np.zeros((60,0)))counter = 1for row in df.index:if df.loc[row,'signal'] == 1:    add_row = df.loc[row - 20:row +20,'VXX_Full']    VXX_signal[counter] = add_row    counter +=1VXX_signal它似乎不起作用。它创建一个数据帧,但值都是 Nan。第一个切片,它至少看起来是从主df获取数据,但是数据不对应于正确的位置。新 df 中的以下列集(有 30 个信号,因此创建了 30 列)都是 NaN提前致谢!
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

我不确定您当前的代码 - 但基本上您所需要的只是索引范围的列表。如果您的索引是线性的,则如下所示:


indexes = list(df[df.signal==1].index)

ranges = [(i,list(range(i-20,i+21))) for i in indexes] #create tuple (original index,range)

dfs = [df.loc[i[1]].copy().rename(

                    columns={'VXX_Full':i[0]}).reset_index(drop=True) for i in ranges]

#EDIT: for only the VXX_Full Column:

dfs = [df.loc[i[1]].copy()[['VXX_Full']].copy().rename(

                    columns={'VXX_Full':i[0]}).reset_index(drop=True) for i in ranges]

#here we take the -20:+20 slice of df, make a separate dataframe, the

#we change 'VXX_Full' to the original index value, and reset index to give it 0:40 index.

#The new index will be useful when putting all the columns next to each other.

因此,我们制作了一个信号== 1的索引列表,将其转换为范围列表,最后是具有重置索引的数据帧列表。现在我们想把它们合并在一起:


from functools import reduce

merged_df = reduce(lambda left, right: pd.merge(

                          left, right, left_index=True, right_index=True), dfs)


查看完整回答
反对 回复 2022-08-25
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我会从列表字典中构建生成的数据帧:

resul = pd.DataFrame({i:df.loc[i-20 if i >=20 else 0: i+40 if i <= len(df) - 40 else len(df), 
                               'VXX_FULL'].values for i in df.loc[df.signal == 1].index})

诀窍是提取一个没有关联索引的numpy数组。.values

注意:上面的代码假设原始数据帧的索引只是行号。如果不同,请先使用。reset_index


查看完整回答
反对 回复 2022-08-25
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信