如何使用单行表达式生成多个连续相同的combinations具有自己唯一的相同的id并将结果存储在中df?
我们希望简化并提高执行速度的工作代码示例 col5 列包含生成集的唯一标识符gc
import itertools as iter
import pandas as pd
gc = iter.combinations(range(1, 7), 4)
df = pd.DataFrame(gc, columns=['col1', 'col2', 'col3', 'col4'])
dfr = pd.DataFrame()
for i in range(1,4):
dfi = df.copy()
dfi['col5'] = i
dfr = pd.concat([dfr, dfi])
dfr = dfr.reset_index().drop(columns='index')
print(dfr)
预期结果
col1 col2 col3 col4 col5
0 1 2 3 4 1
1 1 2 3 5 1
2 1 2 3 6 1
3 1 2 4 5 1
4 1 2 4 6 1
5 1 2 5 6 1
6 1 3 4 5 1
7 1 3 4 6 1
8 1 3 5 6 1
9 1 4 5 6 1
10 2 3 4 5 1
11 2 3 4 6 1
12 2 3 5 6 1
13 2 4 5 6 1
14 3 4 5 6 1
15 1 2 3 4 2
16 1 2 3 5 2
17 1 2 3 6 2
18 1 2 4 5 2
19 1 2 4 6 2
20 1 2 5 6 2
21 1 3 4 5 2
22 1 3 4 6 2
23 1 3 5 6 2
24 1 4 5 6 2
25 2 3 4 5 2
26 2 3 4 6 2
27 2 3 5 6 2
28 2 4 5 6 2
29 3 4 5 6 2
30 1 2 3 4 3
31 1 2 3 5 3
32 1 2 3 6 3
33 1 2 4 5 3
34 1 2 4 6 3
35 1 2 5 6 3
36 1 3 4 5 3
37 1 3 4 6 3
38 1 3 5 6 3
39 1 4 5 6 3
40 2 3 4 5 3
41 2 3 4 6 3
42 2 3 5 6 3
43 2 4 5 6 3
44 3 4 5 6 3
好吧,这种方式似乎更快,尽管在您的示例中速度差异仅为 2 倍左右。在较大的表上,也许差异会更显着:
说明:
concat如果您一次完成所有累积的数据帧,速度会快得多。而且由于它们对您来说是相同的(除了最后一列),因此也无需复制它们,您可以将数据框与自身连接所需的次数更新:如果你通过 ,它会更快
Numpy,并DataFrame在最后(如果有必要的话)变成。或多或少是这样的:在这里,您可以(并且应该)进一步优化,例如,立即创建
Numpy所需大小的矩阵,而不是vstackandhstack,而是将矩阵放入已经完成的矩阵中。虽然有必要看看它会如何更快,但没有必要用组合制作许多矩阵副本。