

例えば、下記のように繰り返しランダムにデータフレームxを自動生成し、  
それを一つのデータフレームdfに自動的に繋げていく方法を教えてください。

[code]

    import pandas as pd
    import numpy as np
    
    i = 0
    arr = []
    for i in range(3):
        x = pd.DataFrame(np.random.rand(3))
        arr[i] = x
        df = merge([arr[0],arr[i]])
    
    print(df)
    
[/code]

* * *
[code]

    IndexError                                Traceback (most recent call last)
    <ipython-input-4-3499f5327871> in <module>()
          6 for i in range(3):
          7     x = pd.DataFrame(np.random.rand(3))
    ----> 8     arr[i] = x
          9     df = merge([arr[0],arr[i]])
         10 
    
    IndexError: list assignment index out of range
    
[/code]


CC BY-SA 4.0
2019-08-18T00:24:28.393
57421
2023-04-10T08:51:02.763
2019-08-18T03:43:35.113
3605
30017
question
python pandas
自動生成したデータフレームを　繰り返し繋ぎ合わせる方法について教えてください。


**更新：** こちらの方が少しだけシンプルかも

[code]

    import pandas as pd
    import numpy as np
    
    arr = []
    for i in range(3):
      x = pd.DataFrame(np.random.rand(3))
      arr.append(x)
    
    df = pd.concat(arr, ignore_index=True)
    
    print(arr)
    print(df)
    
[/code]

* * *

こんな処理で出来ます。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame()
    for i in range(3):
      x = pd.DataFrame(np.random.rand(3))
      df = pd.concat([df,x], ignore_index=True)
    
    print(df)
    
[/code]

* * *

ちなみに、後で何かに使うため個々の`DataFrame`も`arr[]`として残しておきたいと言った場合には、以下の様になります。

[code]

    import pandas as pd
    import numpy as np
    
    arr = []
    df = pd.DataFrame()
    for i in range(3):
      x = pd.DataFrame(np.random.rand(3))
      arr.append(x)
      df = pd.concat([df,x], ignore_index=True)
    
    print(arr)
    print(df)
    
[/code]


CC BY-SA 4.0
2019-08-18T01:43:07.217
57422
2019-08-22T15:58:01.033
2019-08-22T15:58:01.033
26370
26370
57421
answer


「一つのデータフレームdfに自動的に繋げていく方法」  
ですが, どのような結果を望むのか書いてないので適当に行います

  * "9 x 1"
  * "3 x 3" (getting longer, getting wider どちらか)
  * "1 x 9"

別の回答に, "9 x 1" の構築があるので, ここでは "3 x 3" で。  
・・・ 3カラムの DataFrameを, 行数分繋げる方法

質問のコードでは `merge`が使われてるけど, これは keyや idを利用して結び付けるもので  
今回のように index増やすだけの操作には `concat` を使います

[code]

    import pandas as pd
    import numpy as np
    #!pip install perfplot
    import perfplot
    
    row, col = (1000, 3)
    
    def concat(r):
        """毎回 pd.concat()
        最初に空の DataFrame用意し, 継ぎ足していく
        """
        df = pd.DataFrame()
        for n in range(r):
            x = pd.DataFrame(np.random.rand(col)).T
            df = pd.concat([df, x], axis=0)
        return df
    
    def concat_arr(r):
        """最後に一度だけ pd.concat()
        arr: list 用意し, 毎回それに追加し
        最後に連結(concat)する
        """
        arr = []
        for n in range(r):
            x = pd.DataFrame(np.random.rand(col)).T
            arr.append(x)
        return pd.concat(arr, axis=0)
    
    def series_concat(r):
        """Series を使う (1)
        一次元データの Seriesを使い, arr に追加していき
        最後に連結(concat)する
        """
        arr = []
        for n in range(r):
            ser = pd.Series(np.random.rand(col))
            arr.append(ser)
        return pd.concat(arr, axis=1).T
    
    def series_df(r):
        """Series を使う (2)
        一次元データの Seriesを使い, arr に追加していき
        最後に DataFrameを作り出す
        """
        arr = []
        for n in range(r):
            ser = pd.Series(np.random.rand(col))
            arr.append(ser)
        return pd.DataFrame(arr)
    
    def np_rand(r):
        return pd.DataFrame(np.random.rand(r, col))
    
    
    out = perfplot.bench(
        setup=lambda n: n,
        n_range=[2**k for k in range(10)],
        kernels=[
            concat,
            concat_arr,
            series_concat,
            series_df,
            # np_rand,
        ],
        equality_check=lambda r1, r2: r1.shape == r2.shape,
        xlabel="row(r)",
    )
    out.show()
    #out.save("out.svg")
    
[/code]

[![結果のベンチマーク](https://i.stack.imgur.com/KP7y1.png)](https://i.stack.imgur.com/KP7y1.png)

* * *

DataFrameライブラリーはちまちま追加していくと遅くなります  
(すべての DataFrameライブラリー知るわけではないが, そのような傾向にあると思います)  
このため, 最後にまとめて `concat` 行うほうがよいでしょう

`Series`が高速なのは, DataFrameの構造上, カラムを追加していくほうが速いためでしょう(たぶん)

何のためにこのような追加を行いたいか不明だけど  
一番高速なのは, 上のコードの `np_rand` です  
(もしくは NumPy の NDArray を先に, 必要分用意しておいて, DataFrame作成)  
設計時に, このように, DataFrame 追加せずに済むようにするのが望ましいかも


CC BY-SA 4.0
2023-04-10T08:51:02.763
94469
2023-04-10T08:51:02.763
43025
57421
answer