【问题标题】:Loading Numpy array to single Pandas DataFrame colums将 Numpy 数组加载到单个 Pandas DataFrame 列
【发布时间】:2021-01-16 15:48:39
【问题描述】:

我正在使用 PySpark 并尝试使用 CSV 来存储我的数据。我将我拥有的 Numpy 数组转换为 DataFrame,它的格式如下:

label   |     0    1     2     4    ...    768
---------------------------------------
  1     |   0.12  0.23  0.31  0.72  ...   0.91

等等,将数组中“行向量”本身的每个值拆分为单独的列。该格式与 Spark 不兼容,它需要将 features 全部放在一列中。有没有办法可以将我的数组加载到该格式的 DataFrame 中?例如:

label   |     Features
------------------------------------------
  1     |   [0.12,0.23,0.31,0.72,...,0.91]

我尝试遵循 this thread 的建议,该建议详细说明了使用 Spark API 合并列,但是在加载我的标签时,我收到一个错误,因为标签成为向量的一部分,而不是 stringint价值。

【问题讨论】:

    标签: python arrays pandas numpy apache-spark


    【解决方案1】:

    应该做到这一点,注意我决定使用整数而不是浮点数以获得更好的可读性:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.randint(20, 30, size=30).reshape(3, 10))
    df.insert(0, "label", [1,2,3])
    
    print(df)
    
       label   0   1   2   3   4   5   6   7   8   9
    0      1  26  27  25  29  20  23  26  25  22  23
    1      2  20  20  26  25  23  23  26  24  27  23
    2      3  24  22  24  22  26  23  27  22  26  23
    

    选择所有特征列(我在这里使用iloc)并将它们转换为列表列表。

    features = df.iloc[:, 1:].to_numpy().tolist()
    
    print(features)
    [[26, 27, 25, 29, 20, 23, 26, 25, 22, 23],
     [20, 20, 26, 25, 23, 23, 26, 24, 27, 23],
     [24, 22, 24, 22, 26, 23, 27, 22, 26, 23]]
    

    然后使用您的标签和新功能创建一个新数据框:

    new_df = pd.DataFrame({
        "label": df["label"],
        "features": features
    })
    
    print(new_df)
    
       label                                  features
    0      1  [26, 27, 25, 29, 20, 23, 26, 25, 22, 23]
    1      2  [20, 20, 26, 25, 23, 23, 26, 24, 27, 23]
    2      3  [24, 22, 24, 22, 26, 23, 27, 22, 26, 23]
    

    【讨论】:

      【解决方案2】:

      我对 spark 一无所知,但你想要一个包含一列列表的数据框,只需 df['features'] = SOME_2D_LIST_OF_LISTS

      data = [[1,2,3],[4,5,6],[7,8,9]]
      df = pd.DataFrame()
      df['Features'] = data # now you have a column of lists
      # If for whatever reason you want each row value to itself be a numpy array add
      df['Features'] = df['Features'].map(np.array)
      

      如果数据已经是一个 numpy 数组,只需执行df['Features'] = data.tolist()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-12
        • 2017-08-25
        • 2018-01-01
        • 2020-08-20
        • 1970-01-01
        • 2019-05-05
        • 2018-12-27
        • 2019-08-04
        相关资源
        最近更新 更多