繁体   English   中英

如何从数据帧中创建序列并将它们放入数组数组或列表中?

[英]How to create sequences out of a dataframe and put them in an array of arrays or a list?

对于输入:

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]]

在这里,我使用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]]

尝试:

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]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM