回答編集履歴
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 | 
             
            ```
         | 
