【问题标题】:Convert numpy array to dataframe (large number of columns)将numpy数组转换为数据框(大量列)
【发布时间】:2021-10-29 23:37:23
【问题描述】:

如何将 numpy 数组转换为 pandas 数据框。 为简单起见,该数组仅包含 5 个值。实际上还有更多。

import numpy as np
import pandas as pd
nparray1 = np.array([1,2,3,4,5])
nparray2 = np.array([2,2,2,6,6])

我想从 nparray1 中得到以下数据帧结构:

| column1 | column2 | column3 | column4 | column5 |
|---------|---------|---------|---------|---------|
| 1       | 2       | 3       | 4       | 5       |
|         |         |         |         |         |

在下一步中,我想将 nparray2 附加到数据框:

| column1 | column2 | column3 | column4 | column5 |
|---------|---------|---------|---------|---------|
| 1       | 2       | 3       | 4       | 5       |
| 2       | 2       | 2       | 6       | 6       |

【问题讨论】:

    标签: python arrays pandas dataframe numpy


    【解决方案1】:

    Pandas 是基于列的,因此请尝试一次对整列而不是行进行操作,这样会快得多。

    基于列的解决方案如下所示:

    n_arrays = 100
    n_columns = 10000
    arrays = [
        np.random.randint(0, 10, size=n_columns)
        for n in range(n_arrays)
    ]
    df = pd.DataFrame(
        {
            row_index: row_array
            for row_index, row_array in enumerate(arrays)
        }
    ).T
    

    将您的数组分配给 Pandas 列,然后转置矩阵以将列转换为行。

    将性能与基于行的解决方案进行比较:

    In [18]: %timeit df = pd.DataFrame({row_index: row_array for row_index, row_array in enumerate(arrays)}).T
    6.2 ms ± 21.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [19]: %timeit df = pd.DataFrame(arrays)
    1.01 s ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    差异巨大(快 150 倍)。

    【讨论】:

      【解决方案2】:

      创建DataFrame,然后添加DataFrame.loc

      nparray1 = np.array([1,2,3,4,5])
      nparray2 = np.array([2,2,2,6,6])
      
      df = pd.DataFrame([nparray1])
      print (df)
         0  1  2  3  4
      0  1  2  3  4  5
      
      df.loc[len(df)] = nparray2
      print (df)
         0  1  2  3  4
      0  1  2  3  4  5
      1  2  2  2  6  6
      

      或者:

      df = pd.DataFrame([nparray1, nparray2])
      print (df)
         0  1  2  3  4
      0  1  2  3  4  5
      1  2  2  2  6  6
      

      编辑:

      如果性能很重要,则创建二维数组:

      np.random.seed(2021)
      n_arrays = 100
      n_columns = 10000
      arrays = [
          np.random.randint(0, 10, size=n_columns)
          for n in range(n_arrays)
      ]
      
      
      In [41]: %timeit df = pd.DataFrame(arrays)
      919 ms ± 40 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
      
      In [42]: %timeit df = pd.DataFrame(np.array(arrays))
      2.39 ms ± 86.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      

      另一种解决方案:

      In [43]: %timeit df = pd.DataFrame({row_index: row_array for row_index, row_array in enumerate(arrays)}).T
      7.16 ms ± 340 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      

      【讨论】:

      • 如果你有很多大数组,这会很慢。检查我的答案以获得更快的解决方案 - 您必须使用列,而不是行。
      • 您在您的回答中添加了我的回答?不错:)
      • @gshpychka - 当然,用于测试。
      猜你喜欢
      • 2017-11-09
      • 2019-12-27
      • 2017-06-28
      • 2018-12-15
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多