回答編集履歴
2
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
lens = np.array([len(arr) for arr in arrs])
|
10
10
|
|
11
11
|
idx = cartesian([np.arange(length) for length in lens])
|
12
|
-
offset =
|
12
|
+
offset = lens.cumsum() - lens
|
13
13
|
|
14
14
|
new_arr = np.vstack(arrs)[idx+offset].reshape(-1, 2*len(df_list))
|
15
15
|
return pd.DataFrame(new_arr, columns=np.concatenate(
|
1
追記
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
コードを整理すればもっといい方法があるかもしれませんが、いかがでしょうか。`itertools.product`より速いと思われます(特に各要素が数値なら)。
|
1
|
+
コードを整理すればもっといい方法があるかもしれませんが、以下の方法でいかがでしょうか。`itertools.product`より速いと思われます(特に各要素が数値なら)。
|
2
2
|
|
3
3
|
```python
|
4
4
|
from sklearn.utils.extmath import cartesian
|
@@ -16,7 +16,7 @@
|
|
16
16
|
[df.columns.to_numpy() for df in df_list]))
|
17
17
|
```
|
18
18
|
|
19
|
-
動作確認
|
19
|
+
## 動作確認
|
20
20
|
|
21
21
|
```python
|
22
22
|
In [11]: l_1 = [[1, 2], [3, 4]]
|
@@ -107,4 +107,36 @@
|
|
107
107
|
7 1 2 11 22 333 444 3333 4444 33333 44444
|
108
108
|
8 1 2 33 44 111 222 1111 2222 11111 22222
|
109
109
|
# (後略)
|
110
|
+
```
|
111
|
+
|
112
|
+
## 速度比較
|
113
|
+
|
114
|
+
```python
|
115
|
+
In [21]: def df_product_itertools(df_list):
|
116
|
+
: lsts = [df.to_numpy().tolist() for df in df_list]
|
117
|
+
: new_list = [reduce(add, e) for e in itertools.product(*lsts)]
|
118
|
+
: return pd.DataFrame(new_list, columns=np.concatenate(
|
119
|
+
: [df.columns.to_numpy() for df in df_list]))
|
120
|
+
|
121
|
+
In [22]: l_1 = [[1, 2], [3, 4]]
|
122
|
+
: l_2 = [[11, 22], [33, 44]]
|
123
|
+
: l_3 = [[111, 222], [333, 444]]
|
124
|
+
: l_4 = [[1111, 2222], [3333, 4444]]
|
125
|
+
: l_5 = [[11111, 22222], [33333, 44444]]
|
126
|
+
:
|
127
|
+
: df1 = pd.DataFrame(l_1, columns=['A', 'B'])
|
128
|
+
: df2 = pd.DataFrame(l_2, columns=['C', 'D'])
|
129
|
+
: df3 = pd.DataFrame(l_3, columns=['E', 'F'])
|
130
|
+
: df4 = pd.DataFrame(l_4, columns=['G', 'H'])
|
131
|
+
: df5 = pd.DataFrame(l_5, columns=['I', 'J'])
|
132
|
+
|
133
|
+
In [23]: %timeit df_product([df1, df2, df3, df4])
|
134
|
+
: %timeit df_product_itertools([df1, df2, df3, df4])
|
135
|
+
355 µs ± 18.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
|
136
|
+
928 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
|
137
|
+
|
138
|
+
In [24]: %timeit df_product([df1, df2, df3, df4, df5])
|
139
|
+
: %timeit df_product_itertools([df1, df2, df3, df4, df5])
|
140
|
+
378 µs ± 12.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
|
141
|
+
1.12 ms ± 17.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
|
110
142
|
```
|