【问题标题】:Split one dataframe into multiple dataframes with same column header based on values根据值将一个数据帧拆分为具有相同列标题的多个数据帧
【发布时间】:2020-04-21 08:47:21
【问题描述】:

我有一个如下所示的数据框

+------+------+---+---+---+
| S.No | A    | B | C | D |
+------+------+---+---+---+
| 1    | 0.25 | 2 | 1 | 5 |
+------+------+---+---+---+
| 2    | 1.1  | 4 | 2 | 5 |
+------+------+---+---+---+
| 3    | 1.5  | 6 | 3 | 5 |
+------+------+---+---+---+
| 4    | 0.32 | 3 | 4 | 5 |
+------+------+---+---+---+
| 5    | 1.45 | 5 | 5 | 5 |
+------+------+---+---+---+
| 6    | 1.9  | 7 | 6 | 5 |
+------+------+---+---+---+
| 7    | 0.5  | 3 | 4 | 5 |
+------+------+---+---+---+
| 8    | 1.49 | 5 | 5 | 5 |
+------+------+---+---+---+

我想将它们拆分为具有相同列标题值名称的 3 个数据帧,拆分基于 Column A 值,即第一个数据帧应从 0.25 开始并以 1.5 结束,第二个数据帧应从 @ 开始987654325@ 并以1.9 结束,第三个数据帧应从0.5 开始并以1.49 结束。即当column A 中的值在0-1 之间时,应该开始拆分,它们都应该保留相同的列标题值。预期输出如下,由于我是新手,我不知道如何正确完成此操作,不胜感激。

数据框 1:

+------+------+---+---+---+
| S.No | A    | B | C | D |
+------+------+---+---+---+
| 1    | 0.25 | 2 | 1 | 5 |
+------+------+---+---+---+
| 2    | 1.1  | 4 | 2 | 5 |
+------+------+---+---+---+
| 3    | 1.5  | 6 | 3 | 5 |
+------+------+---+---+---+

数据框 2:

+------+------+---+---+---+
| S.No | A    | B | C | D |
+------+------+---+---+---+
| 4    | 0.32 | 3 | 4 | 5 |
+------+------+---+---+---+
| 5    | 1.45 | 5 | 5 | 5 |
+------+------+---+---+---+
| 6    | 1.9  | 7 | 6 | 5 |
+------+------+---+---+---+

数据框 3:

+------+------+---+---+---+
| S.No | A    | B | C | D |
+------+------+---+---+---+
| 7    | 0.5  | 3 | 4 | 5 |
+------+------+---+---+---+
| 8    | 1.49 | 5 | 5 | 5 |
+------+------+---+---+---+

【问题讨论】:

  • 您是根据 A 的条件值进行拆分,还是仅仅通过选择行索引?

标签: python pandas dataframe


【解决方案1】:

让我们做cumsum

d={x: y for x , y in df.groupby(df.A.between(0,1).cumsum())}

【讨论】:

    【解决方案2】:

    您首先要识别值介于 0 和 1 之间的索引。这是通过 betweenindex 的组合来完成的。获得索引后,您可以使用iloc 开始拆分数据帧 方法

    #Identifies indices based on variable A
    splitIndices = df.index[df.A.between(0,1)].tolist()
    
    
    dfList = []
    
    for i in range(len(splitIndices)-1):
        startIndex = splitIndices[i]
        endIndex = splitIndices[i+1]
    
        tempDf = df.iloc[startIndex : endIndex]
    
        #Appends the dataframe subset to the output list
        dfList.append(tempDf.copy())
    

    【讨论】:

    • 非常好,达到了我的预期。谢谢@Roshan Santhosh
    【解决方案3】:

    根据您提供的解释,您包含了一个 between 条件, 例如:

    第一个数据帧应该从 0.25 开始并以 1.5 结束

    这意味着像 0.32 这样的值应该包含在数据框中

    使用该逻辑,您可以执行以下操作:

    l=[.25,1.5,.32,1.9,.5,1.49]
    r=[(a,b) for a,b in zip(l[::2],l[1::2])]
    for i in r:
        r i in r:
        print(df[df['A'].between(*i,inclusive=True)].sort_values('A'))
        print("----------------------------------")
    

       S.No     A    B    C    D
    0   1.0  0.25  2.0  1.0  5.0
    3   4.0  0.32  3.0  4.0  5.0
    6   7.0  0.50  3.0  4.0  5.0
    1   2.0  1.10  4.0  2.0  5.0
    4   5.0  1.45  5.0  5.0  5.0
    7   8.0  1.49  5.0  5.0  5.0
    2   3.0  1.50  6.0  3.0  5.0
    ----------------------------------
       S.No     A    B    C    D
    3   4.0  0.32  3.0  4.0  5.0
    6   7.0  0.50  3.0  4.0  5.0
    1   2.0  1.10  4.0  2.0  5.0
    4   5.0  1.45  5.0  5.0  5.0
    7   8.0  1.49  5.0  5.0  5.0
    2   3.0  1.50  6.0  3.0  5.0
    5   6.0  1.90  7.0  6.0  5.0
    ----------------------------------
       S.No     A    B    C    D
    6   7.0  0.50  3.0  4.0  5.0
    1   2.0  1.10  4.0  2.0  5.0
    4   5.0  1.45  5.0  5.0  5.0
    7   8.0  1.49  5.0  5.0  5.0
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2016-02-28
      • 1970-01-01
      • 2019-08-20
      • 2019-10-22
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多