2017-01-26 27 views
5

Powiedzmy że masz 3 tablice numpy: lat, lon, val:Pandy: tworzenie dataframe z tablicami 2d NumPy zachowaniem ich kolejności sekwencyjnej

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]]) 

i powiedzieć, że chcesz stworzyć pandas dataframe gdzie df.columns = ['lat', 'lon', 'val'], ale ponieważ każda wartość w lat jest powiązana zarówno z liczbą long, jak i val, chcesz, aby pojawiły się w tym samym wierszu.

Również chcesz row-mądry porządek każdej kolumny śledzić pozycje w każdej tablicy, tak aby uzyskać następujące dataframe:

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

Więc w zasadzie pierwszy wiersz w sklepach dataframe „pierwszy "ilości każdej tablicy i tak dalej. Jak to zrobić?

Nie mogłem znaleźć pythonic sposób to zrobić, więc każda pomoc będzie bardzo ceniona.

Odpowiedz

7

myślę najprostsze podejście jest spłaszczenie tablic za pomocą 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 - Dziękujemy. – jezrael

+0

Dziękuję za odpowiedź! – FaCoffee

2

coś takiego -

testową
# 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 

Runtime -

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

Nie trzeba Ravela pierwszy . Możesz po prostu sztaplować i iść.

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