【问题标题】:How to create sequences out of a dataframe and put them in an array of arrays or a list?如何从数据框中创建序列并将它们放入数组数组或列表中?
【发布时间】:2020-05-01 04:30:05
【问题描述】:

对于输入:

df = pd.DataFrame(np.array([[1,  "A"],[2, "A"],[3, "B"],[4, "C"],[5, "D" ],[6, "A" ],[7, "B" ],[8, "A" ],[9, "C" ],[10, "D" ],[11,"A" ],
                           [12,  "A"],[13, "B"],[14, "B"],[15, "D" ],[16, "A" ],[17, "B" ],[18, "A" ],[19, "C" ],[20, "D" ],[21,"A" ],
                           [22,  "A"],[23, "A"],[24, "C"],[25, "D" ],[26, "A" ],[27, "C" ],[28, "A" ],[29, "C" ],[30, "D" ] ]),
                            columns=['No.',  'Value'])

我得到以下输出:

    No. Value
0   1   A
1   2   A
2   3   B
3   4   C
4   5   D
5   6   A
6   7   B
7   8   A
8   9   C
9   10  D
10  11  A
11  12  A
12  13  B
13  14  B
14  15  D
15  16  A
16  17  B
17  18  A
18  19  C
19  20  D
20  21  A
21  22  A
22  23  A
23  24  C
24  25  D
25  26  A
26  27  C
27  28  A
28  29  C
29  30  D

现在我想创建数据序列。该序列定义了一个值区域,直到出现值“D”。例如在第一个序列中,有从 No.1 到 No.5 的行(包括) 第二个序列是从No.6到No.10(包括)等等。

之后我想将值编码为数字:A -> 1, B->2, C->3, D->4 如果在一个序列中,值 A 后面跟着另一个 A 或多个 A,它将被汇总为一个数字 1。这同样适用于其他值。

第一个序列 = A,A,B,C,D 为此,我想要这样的东西 = [1,2,3,4]

对于整个输出,我想要这样的东西:

result = list([[1,2,3,4],[1,2,1,3,4],[1,2,4],[1,2,1,3,4],[1,3,4],[1,3,1,3,4]])

输出:

[[1, 2, 3, 4],
 [1, 2, 1, 3, 4],
 [1, 2, 4],
 [1, 2, 1, 3, 4],
 [1, 3, 4],
 [1, 3, 1, 3, 4]]

【问题讨论】:

    标签: python arrays pandas list dataframe


    【解决方案1】:

    这里我使用cumsum() 给同一序列中的所有元素一个“序列ID”(每次遇到“D”时值增加1)

    然后使用groupby()按顺序分组,并将每个组输出到一个列表中,然后依次过滤,使连续的值统一,如下所示:

    import pandas as pd
    import numpy as np
    from itertools import groupby
    from pprint import pprint
    
    df = pd.DataFrame(np.array([[1,  "A"],[2, "A"],[3, "B"],[4, "C"],[5, "D" ],[6, "A" ],[7, "B" ],[8, "A" ],[9, "C" ],[10, "D" ],[11,"A" ],
                               [12,  "A"],[13, "B"],[14, "B"],[15, "D" ],[16, "A" ],[17, "B" ],[18, "A" ],[19, "C" ],[20, "D" ],[21,"A" ],
                               [22,  "A"],[23, "A"],[24, "C"],[25, "D" ],[26, "A" ],[27, "C" ],[28, "A" ],[29, "C" ],[30, "D" ] ]),
                                columns=['No.',  'Value'])
    
    df["NumVal"] = df["Value"].map({"A":1,"B":2,"C":3,"D":4})
    df["SequenceID"] = (df["Value"].shift(1) == "D").cumsum()
    
    result = [[nums[0] for nums in groupby(g["NumVal"].tolist())] for k,g in df.groupby("SequenceID")]
    
    pprint(result)
    

    输出:

    [[1, 2, 3, 4],
     [1, 2, 1, 3, 4],
     [1, 2, 4],
     [1, 2, 1, 3, 4],
     [1, 3, 4],
     [1, 3, 1, 3, 4]]
    

    【讨论】:

    • 知道如何正确可视化输出吗?
    • 该代码不适用于数据框中的其他数据。它仍然会给出相同的输出吗?
    • @ML-ME 你是什么意思?还有哪些其他数据?
    【解决方案2】:

    试试:

    from itertools import groupby
    values = df['Value'].replace({'A':1, 'B':2, 'C':3, 'D':4}).values
    idx_list = [idx + 1 for idx, val in enumerate(values) if val == 4]
    result = [values[i: j] for i, j in zip([0] + idx_list, idx_list + ([len(values)] if idx_list[-1] != len(values) else []))]
    result = [[values[0] for values in groupby(l)] for l in result]
    print(result)
    
    [[1, 2, 3, 4], 
     [1, 2, 1, 3, 4], 
     [1, 2, 4], 
     [1, 2, 1, 3, 4], 
     [1, 3, 4], 
     [1, 3, 1, 3, 4]]
    

    【讨论】:

    • 我收到错误:NameError: name 'x' is not defined
    • 知道如何正确可视化输出吗?
    • 它表示每个序列的值的顺序。例如,在第一个序列中,顺序是 1、2、3、4。因此,作为条形图,它可以显示为蓝色、红色、绿色和橙色。第二个序列是 1,2,1,3,4。所以这可以显示为颜色的条形,顺序为蓝色、红色、蓝色、绿色、橙色。
    • 您还可以为列表的每个列表绘制一条线。否则,我真的不知道如何可视化这些值,抱歉
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多