2017-01-26 47 views
5

一個數據幀說,你有3個numpy的數組:latlonval熊貓:從2D numpy的陣列保留其順序

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 
... ... ... ... 

所以基本上「每個陣列的數量,等等。 如何做到這一點?

我找不到這樣做的pythonic方式,所以任何幫助將不勝感激。

回答

7

我認爲最簡單的方法是通過使用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 
+1

@ CF84 - 謝謝。 – jezrael

+0

謝謝你的回答! – FaCoffee

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 
1

無需先綻。你可以堆疊走。

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