按列对将数据帧拆分为子集

问题描述 投票:0回答:1

我有一个包含 N 列的宽数据框。列成对呈现,如下所示:前两列在一起,接下来的两列,直到数据框的末尾:

  XS0552790049  Unnamed: 5583 XS0628646480  Unnamed: 5585
0   2010-10-22          100.0   2011-05-24         99.711
1   2010-10-25          100.0   2011-05-25         99.685
2   2010-10-26          100.0   2011-05-26        100.125
3   2010-10-27          100.0   2011-05-27         99.893
4   2010-10-28          100.0   2011-05-30         99.792

我想将此数据帧划分为 N/2 子集,每个子集包含一对相邻列,因此例如第一对将是

["XS0552790049","Unnamed: 5583"]

我考虑过使用 for 循环,但我肯定错过了一些东西,因为它不会生成子样本。也许我索引错误。

这是我的尝试:我尝试创建一个包含每个键的子样本的字典。

sub = {}
for i in range(0,len(df.columns)+1):
    sub[i] = df.iloc[:,i:i+3]

我对 Python 还很陌生,所以欢迎提出任何建议。

列说明,供记录:

  • 第 1 栏:ISIN 1,每日日期顺序(债券 1 的发行至到期)
  • 第 2 栏:ISIN1 价格历史数据
  • 第 3 栏:ISIN 2,每日日期顺序(债券 2 的发行至到期)
  • 第 4 栏:ISIN2 价格历史数据 等等。
python pandas dataframe subset
1个回答
0
投票

大多数情况下,您只是省略了

range(start, stop, step)
迭代器中的步骤,使用 step=2。

然后列表推导式在这种情况下有利地封装

for
循环:

dfs = [ df.iloc[:,[i,i+1]] for i in range(0, len(df.columns), 2) ]

(请注意,

[:,[i,i+1]]
[:,i:i+2]]
确实返回相同的范围,因此可以相同地使用。)

这将返回您请求的成对子集列表:

dfs
[  XS0552790049  Unnamed: 5583
 0   2010-10-22          100.0
 1   2010-10-25          100.0
 2   2010-10-26          100.0
 3   2010-10-27          100.0
 4   2010-10-28          100.0,
   XS0628646480  Unnamed: 5585
 0   2011-05-24         99.711
 1   2011-05-25         99.685
 2   2011-05-26        100.125
 3   2011-05-27         99.893
 4   2011-05-30         99.792]
dfs[0]
  XS0552790049  Unnamed: 5583
0   2010-10-22          100.0
1   2010-10-25          100.0
2   2010-10-26          100.0
3   2010-10-27          100.0
4   2010-10-28          100.0

旁注:

  • 应避免使用
    sub
    作为变量名,因为这是
    re
    模块中的 Python 函数。
  • 列表看起来比字典更合适,除非您打算指定键来引用每一对。在这里,您使用一个简单的索引,因此,一个列表就足够了。
  • df.shape[1]
    可以取代
    len(df.columns)
    ,因为数据帧维度也由
    df.shape
    作为元组给出。
© www.soinside.com 2019 - 2024. All rights reserved.