【问题标题】:Split data frame into multiple data frames based on a group of parameters in a column根据列中的一组参数将数据框拆分为多个数据框
【发布时间】:2019-09-15 20:37:56
【问题描述】:

我有一个这样的数据框:

DF

ID      A       B       C
00      X0      Y0      PARAMETER_0
01      X1      Y1      PARAMETER_1
02      X2      Y2      PARAMETER_2
03      X3      Y3      PARAMETER_3
04      X4      Y4      PARAMETER_4
05      X5      Y5      PARAMETER_0
06      X6      Y6      PARAMETER_1
07      X7      Y7      PARAMETER_2
08      X8      Y8      PARAMETER_3
09      X9      Y9      PARAMETER_4
10      XX0     YY0     PARAMETER_0
11      XX1     YY1     PARAMETER_1
12      XX2     YY2     PARAMETER_2
13      XX3     YY3     PARAMETER_3
14      XX4     YY4     PARAMETER_4

并且我需要在PARAMETER_4 列中将其拆分为多个数据帧,以得到:

DF_1

ID      A       B       C
00      X0      Y0      PARAMETER_0
01      X1      Y1      PARAMETER_1
02      X2      Y2      PARAMETER_2
03      X3      Y3      PARAMETER_3
04      X4      Y4      PARAMETER_4

DF_2

05      X5      Y5      PARAMETER_0
06      X6      Y6      PARAMETER_1
07      X7      Y7      PARAMETER_2
08      X8      Y8      PARAMETER_3
09      X9      Y9      PARAMETER_4

DF_3

10      XX0     YY0     PARAMETER_0
11      XX1     YY1     PARAMETER_1
12      XX2     YY2     PARAMETER_2
13      XX3     YY3     PARAMETER_3
14      XX4     YY4     PARAMETER_4

我找不到像df.split(axis=0, value='PARAMETER_4')这样的简单函数

对方法有任何想法吗?提前谢谢!

【问题讨论】:

    标签: python pandas python-2.7 dataframe group-by


    【解决方案1】:

    您可以使用比较PARAMETER_4 创建帮助器array,通过索引和dictionary of DataFrames 的累积和来交换值:

    s = pd.factorize(df['C'].eq('PARAMETER_4').iloc[::-1].cumsum().sort_index())[0] + 1
    
    print (s)
    [1 1 1 1 1 2 2 2 2 2 3 3 3 3 3] 
    
    dfs = dict(tuple(df.groupby(s)))
    print (dfs[1])
       ID   A   B            C
    0   0  X0  Y0  PARAMETER_0
    1   1  X1  Y1  PARAMETER_1
    2   2  X2  Y2  PARAMETER_2
    3   3  X3  Y3  PARAMETER_3
    4   4  X4  Y4  PARAMETER_4
    

    你需要的是可能的,但不是recommended

    s = df['C'].eq('PARAMETER_4').iloc[::-1].cumsum()
    for i, g in df.groupby(s):
        globals()[f'DF_{i}'] =  g
    
    print (DF_1)
       ID   A   B            C
    0   0  X0  Y0  PARAMETER_0
    1   1  X1  Y1  PARAMETER_1
    2   2  X2  Y2  PARAMETER_2
    3   3  X3  Y3  PARAMETER_3
    4   4  X4  Y4  PARAMETER_4
    

    另一个想法是检查列c并按GroupBy.cumcount创建的计数器系列分组:

    s = df.groupby('C').cumcount() + 1
    
    dfs = dict(tuple(df.groupby(s)))
    print (dfs[1])
       ID   A   B            C
    0   0  X0  Y0  PARAMETER_0
    1   1  X1  Y1  PARAMETER_1
    2   2  X2  Y2  PARAMETER_2
    3   3  X3  Y3  PARAMETER_3
    4   4  X4  Y4  PARAMETER_4
    

    【讨论】:

    • 嗨@Jezrael。我会试试的,让你知道。无论如何,数据来源是完全可信的,所以我想使用这种方法没有潜在风险。谢谢!
    【解决方案2】:

    我们可以在这里使用两次groupby。首先,我们在C 列上分组并创建一个cumcount。然后我们对这个 cumcount 进行分组以获取单独的数据帧:

    dfs = [d for _, d in df.groupby(df.groupby('C').cumcount())]
    
    print(dfs[0], '\n')
    print(dfs[1], '\n')
    print(dfs[2])
    

    输出

    
       ID   A   B            C
    0   0  X0  Y0  PARAMETER_0
    1   1  X1  Y1  PARAMETER_1
    2   2  X2  Y2  PARAMETER_2
    3   3  X3  Y3  PARAMETER_3
    4   4  X4  Y4  PARAMETER_4 
    
       ID   A   B            C
    5   5  X5  Y5  PARAMETER_0
    6   6  X6  Y6  PARAMETER_1
    7   7  X7  Y7  PARAMETER_2
    8   8  X8  Y8  PARAMETER_3
    9   9  X9  Y9  PARAMETER_4 
    
        ID    A    B            C
    10  10  XX0  YY0  PARAMETER_0
    11  11  XX1  YY1  PARAMETER_1
    12  12  XX2  YY2  PARAMETER_2
    13  13  XX3  YY3  PARAMETER_3
    14  14  XX4  YY4  PARAMETER_4
    

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多