【问题标题】:How to convert Numpy array to Panda DataFrame如何将 Numpy 数组转换为 Panda DataFrame
【发布时间】:2019-05-17 20:47:29
【问题描述】:

我有一个如下所示的 Numpy 数组:

[400.31865662]
[401.18514808]
[404.84015554]
[405.14682194]
[405.67735105]
[273.90969447]
[274.0894528]

当我尝试使用以下代码将其转换为 Panda Dataframe

y = pd.DataFrame(data)
print(y)

打印时我得到以下输出。为什么我会得到所有这些零?

            0
0  400.318657
            0
0  401.185148
            0
0  404.840156
            0
0  405.146822
            0
0  405.677351
            0
0  273.909694
            0
0  274.089453

我想得到一个看起来像这样的单列数据框:

400.31865662
401.18514808
404.84015554
405.14682194
405.67735105
273.90969447
274.0894528

【问题讨论】:

  • 你一定是在做别的事情,因为我得到的正是你所期望的。在您创建 DataFrame 之前,data 究竟是什么样的?看起来每个项目都是自己的DataFrame
  • 我无法重现您的错误,您可以发布print(data)吗?数据框需要有一个索引(行指示符)和一个列名(列指示符)。如果你不提供它们,pandas 会自动创建它们:调用print(df) 时,你应该会在行中看到 0,1,2..,在列中看到 0。如果您只想查看数据,请使用y.values
  • 问题出在您的阵列上:array = np.array(np.random.randn(5)) 然后pd.DataFrame(array)。按预期工作。
  • 你说得对安德鲁(数据)确实是我没有意识到的数组列表。那么如何将它们聚合到一个数组中,以便将其转换为 Pandas 数据框?
  • As (data) 实际上是一个数组列表我尝试了以下代码:newdf = pd.DataFrame(data) newdf.to_csv('test.csv',mode='w', sep=',',header=False,index=False) 我得到的结果只是列表的最后一个数组274.08945279667057。如何将数组列表连接到同一个文件中?

标签: python pandas numpy type-conversion numpy-ndarray


【解决方案1】:

由于我假设这篇文章的许多访问者不是因为 OP 的特定和不可重现的问题,这里是一个一般性的答案

df = pd.DataFrame(array)

pandas 的优势在于美观(如 Excel),因此使用列名很重要。

import numpy as np
import pandas as pd

array = np.random.rand(5, 5)
array([[0.723, 0.177, 0.659, 0.573, 0.476],
       [0.77 , 0.311, 0.533, 0.415, 0.552],
       [0.349, 0.768, 0.859, 0.273, 0.425],
       [0.367, 0.601, 0.875, 0.109, 0.398],
       [0.452, 0.836, 0.31 , 0.727, 0.303]])
columns = [f'col_{num}' for num in range(5)]
index = [f'index_{num}' for num in range(5)]

神奇之处就在这里:

df = pd.DataFrame(array, columns=columns, index=index)
            col_0     col_1     col_2     col_3     col_4
index_0  0.722791  0.177427  0.659204  0.572826  0.476485
index_1  0.770118  0.311444  0.532899  0.415371  0.551828
index_2  0.348923  0.768362  0.858841  0.273221  0.424684
index_3  0.366940  0.600784  0.875214  0.108818  0.397671
index_4  0.451682  0.836315  0.310480  0.727409  0.302597

【讨论】:

    【解决方案2】:

    还有另一种方法,其他答案中没有提到。如果你有一个 NumPy 数组,它本质上是一个行向量(或列向量),即形状像 (n, ) ,那么你可以执行以下操作:

    # sample array
    x = np.zeros((20))
    # empty dataframe
    df = pd.DataFrame()
    # add the array to df as a column
    df['column_name'] = x
    

    这样您可以将多个数组添加为单独的列。

    【讨论】:

      【解决方案3】:

      我刚刚发现我的错误。 (data) 是一个数组列表:

      [array([400.0290173]), array([400.02253235]), array([404.00252113]), array([403.99466754]), array([403.98681395]), array([271.97896036]), array([271.97110677])]
      

      所以我使用np.vstack(data) 来连接它

      conc = np.vstack(data)
      
      [[400.0290173 ]
       [400.02253235]
       [404.00252113]
       [403.99466754]
       [403.98681395]
       [271.97896036]
       [271.97110677]]
      

      然后我使用

      将串联数组转换为 Pandas Dataframe
      newdf = pd.DataFrame(conc)
      
      
          0
      0  400.029017
      1  400.022532
      2  404.002521
      3  403.994668
      4  403.986814
      5  271.978960
      6  271.971107
      

      等等!

      【讨论】:

        【解决方案4】:

        你可以flatten numpy 数组:

        import numpy as np
        import pandas as pd
        
        data = [[400.31865662],
                [401.18514808],
                [404.84015554],
                [405.14682194],
                [405.67735105],
                [273.90969447],
                [274.0894528]]
        
        arr = np.array(data)
        
        df = pd.DataFrame(data=arr.flatten())
        
        print(df)
        

        输出

                    0
        0  400.318657
        1  401.185148
        2  404.840156
        3  405.146822
        4  405.677351
        5  273.909694
        6  274.089453
        

        【讨论】:

        • 这并不能真正解决问题,因为即使您不展平数据,pd.DataFrame(data) 也可以工作。问题是别的,这可能最终解决了 OP 的问题,也可能没有。
        • 以上所有很棒的答案,如果有帮助,可以做的另一件事是添加列名df = pd.DataFrame(data=arr.flatten(), columns=['Values'])
        猜你喜欢
        • 2017-08-10
        • 2021-02-21
        • 2019-08-04
        • 2020-02-10
        • 2016-07-29
        • 2020-07-12
        • 1970-01-01
        • 2020-02-16
        • 2020-08-20
        相关资源
        最近更新 更多