【问题标题】:Split Dataframe to multiple Dataframes by sub columns按子列将数据框拆分为多个数据框
【发布时间】:2021-04-28 23:30:29
【问题描述】:

我找不到一个优雅的方法来拆分这个表:

Open              Close                High 
 stock1 stock2     stock1 stock2        stock1 stock2
  ..     ..         ..      ..           ..     ..

股票是子列, 每个股票分成多个表,所以第一个表是

df_stock1

   Open Close High

所以每个股票的表格/数据框(可能是 > 2)然后返回这些 dataframes 的数组。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以做这样的事情。这是一个虚构的数据框:

    import pandas as pd
    import numpy as np
    np.random.seed(123)
    df = pd.DataFrame(np.random.randint(1, 10, (6, 6)),
                      columns=pd.MultiIndex.from_product([['Open', 'Close', 'High'],
                                                          ['Stock1', 'Stock2']]))
    

    哪个打印:

    Open         Close          High       
      Stock1 Stock2 Stock1 Stock2 Stock1 Stock2
    0      3      3      7      2      4      7
    1      2      1      2      1      1      4
    2      5      1      1      5      2      8
    3      4      3      5      8      3      5
    4      9      1      8      4      5      7
    5      2      6      7      3      2      9
    

    然后要拆分您的多索引 df,请使用 groupby 和 DataFrame.xs 执行以下操作:

    Split = {idx: df_sub.xs(idx, level=1, axis=1) for idx,df_sub in df.groupby(level=1, axis=1)}
    print(Split['Stock1'])
    

    其中df_sub 指的是多索引df 的第一级。这给出了:

     Open  Close  High
    0     3      7     4
    1     2      2     1
    2     5      1     2
    3     4      5     3
    4     9      8     5
    5     2      7     2
    

    Split2 = {idx: df_sub.xs(idx, level=1, axis=1) for idx,df_sub in df.groupby(level=1, axis=1)}
    print(Split2['Stock2'])
    

    打印:

     Open  Close  High
    0     3      2     7
    1     1      1     4
    2     1      5     8
    3     3      8     5
    4     1      4     7
    5     6      3     9
    

    编辑其他级别

    同样,如果你想要所有的 Open 股票,你可以这样做:

    Split_open = {idx: df_sub.xs(idx, level=0, axis=1) for idx,df_sub in df.groupby(level=0, axis=1)}
    print(Split_open['Open'])
    

    返回:

       Stock1  Stock2
    0       3       3
    1       2       1
    2       5       1
    3       4       3
    4       9       1
    5       2       6
    

    【讨论】:

    • 如果这是您正在寻找的答案,请将其标记为已接受的答案,以便它从未回答的问题列表中消失。干杯!
    • 没问题。这是一个非常好的问题,而且表述得很好!继续努力!
    • 谢谢。我在哪里可以阅读更多关于你所做的事情?你用的函数叫什么名字?
    • 嗯,实际上我找不到任何关于你所做的事情的参考,我能读到的只有 xs,但不知道 gp 是什么,以及那里发生了什么,如果你可以添加的话。
    • 我看到了你所经历的困惑(我在 group by 之后提到了 gp ....这并不是真正的教学。很抱歉。我将 gp 更改为 df_sub 并添加了解释。没有名为 gp 的程序,我明白你为什么感到困惑。我的错!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多