【问题标题】:Pandas: create a dataframe from 2D numpy arrays preserving their sequential orderPandas:从 2D numpy 数组创建一个数据框,保留它们的顺序
【发布时间】:2017-06-11 21:48:38
【问题描述】:

假设你有 3 个 numpy 数组:latlonval

import numpy as np

lat=np.array([[10, 20, 30],
              [20, 11, 33],
              [21, 20, 10]])

lon=np.array([[100, 102, 103],
              [105, 101, 102],
              [100, 102, 103]])

val=np.array([[17, 2, 11],
              [86, 84, 1],
              [9, 5, 10]])

假设您要创建一个 pandas 数据框,其中 df.columns = ['lat', 'lon', 'val'],但由于 lat 中的每个值都与 longval 数量相关联,因此您希望它们出现在同一行。

另外,您希望每列的行顺序遵循每个数组中的位置,因此获得以下数据框:

      lat   lon   val
0     10    100    17
1     20    102    2
2     30    103    11
3     20    105    86
...   ...   ...    ...

所以基本上数据框中的第一行存储每个数组的“第一”数量,依此类推。 如何做到这一点?

我找不到这样做的 Python 方法,因此我们将不胜感激。

【问题讨论】:

    标签: python arrays pandas numpy dataframe


    【解决方案1】:

    我认为最简单的方法是使用ravel 来展平数组:

    df = pd.DataFrame({'lat': lat.ravel(), 'long': long.ravel(), 'val': val.ravel()})
    print (df)
       lat  long  val
    0   10   100   17
    1   20   102    2
    2   30   103   11
    3   20   105   86
    4   11   101   84
    5   33   102    1
    6   21   100    9
    7   20   102    5
    8   10   103   10
    

    【讨论】:

    • @CF84 - 谢谢。
    【解决方案2】:

    类似的东西-

    # Create stacked array
    In [100]: arr = np.column_stack((lat.ravel(),long.ravel(),val.ravel()))
    
    # Create dataframe from it and assign column names    
    In [101]: pd.DataFrame(arr,columns=('lat','long','val'))
    Out[101]: 
       lat  long  val
    0   10   100   17
    1   20   102    2
    2   30   103   11
    3   20   105   86
    4   11   101   84
    5   33   102    1
    6   21   100    9
    7   20   102    5
    8   10   103   10
    

    运行时测试-

    In [103]: lat = np.random.rand(30,30)
    
    In [104]: long = np.random.rand(30,30)
    
    In [105]: val = np.random.rand(30,30)
    
    In [106]: %timeit pd.DataFrame({'lat': lat.ravel(), 'long': long.ravel(), 'val': val.ravel()})
    1000 loops, best of 3: 452 µs per loop
    
    In [107]: arr = np.column_stack((lat.ravel(),long.ravel(),val.ravel()))
    
    In [108]: %timeit np.column_stack((lat.ravel(),long.ravel(),val.ravel()))
    100000 loops, best of 3: 12.4 µs per loop
    
    In [109]: %timeit pd.DataFrame(arr,columns=('lat','long','val'))
    1000 loops, best of 3: 217 µs per loop
    

    【讨论】:

      【解决方案3】:

      无需先解开。你可以堆叠然后走。

      lat, long, val = np.arange(5), np.arange(5), np.arange(5)
      arr = np.stack((lat, long, val), axis=1)
      cols = ['lat', 'long', 'val']
      df = pd.DataFrame(arr, columns=cols)
         lat  long  val
      0    0     0    0
      1    1     1    1
      2    2     2    2
      3    3     3    3
      4    4     4    4
      

      【讨论】:

        猜你喜欢
        • 2017-06-18
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        • 1970-01-01
        相关资源
        最近更新 更多