web-dev-qa-db-fra.com

Pandas: créer une trame de données à partir de tableaux numérotés 2D en conservant leur ordre séquentiel

Disons que vous avez 3 tableaux numpy: lat, lon, val:

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

Et dites que vous voulez créer une image pandasdf.columns = ['lat', 'lon', 'val'], mais étant donné que chaque valeur de lat est associée à une quantité long et à une val, vous voulez qu'elles apparaissent dans la même ligne.

En outre, vous souhaitez que l'ordre des lignes de chaque colonne suive les positions de chaque tableau afin d'obtenir le cadre de données suivant:

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

Donc, fondamentalement, la première ligne du cadre de données stocke les "premières" quantités de chaque tableau, et ainsi de suite. Comment faire ça?

Je ne pouvais pas trouver un moyen de le faire en pythonique, donc toute aide sera grandement appréciée.

7
FaCoffee

Je pense que l’approche la plus simple consiste à aplatir les tableaux en utilisant 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
10
jezrael

Quelque chose comme ça -

# 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

Test d'exécution -

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
Divakar

Pas besoin de défiler d'abord. Vous pouvez juste empiler et aller.

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
2
user4322543