python - Pandas: Creando DataFrame desde Series
mat (3)
Aquí es cómo crear un DataFrame donde cada serie es una fila .
Para una sola serie (que resulta en un DataFrame de una sola fila):
series = pd.Series([1,2], index=[''a'',''b''])
df = pd.DataFrame([series])
Para series múltiples con índices idénticos:
cols = [''a'',''b'']
list_of_series = [pd.Series([1,2],index=cols), pd.Series([3,4],index=cols)]
df = pd.DataFrame(list_of_series, columns=cols)
Para series múltiples con índices posiblemente diferentes:
list_of_series = [pd.Series([1,2],index=[''a'',''b'']), pd.Series([3,4],index=[''a'',''c''])]
df = pd.concat(list_of_series, axis=1).transpose()
Para crear un DataFrame donde cada serie es una columna , vea las respuestas de otros. Alternativamente, uno puede crear un DataFrame donde cada serie es una fila, como se df.transpose()
arriba, y luego usar df.transpose()
. Sin embargo, el último enfoque es ineficiente si las columnas tienen diferentes tipos de datos.
Mi código actual se muestra a continuación: estoy importando un archivo MAT e intentando crear un DataFrame a partir de las variables que contiene:
mat = loadmat(file_path) # load mat-file
Variables = mat.keys() # identify variable names
df = pd.DataFrame # Initialise DataFrame
for name in Variables:
B = mat[name]
s = pd.Series (B[:,1])
Así que dentro del bucle puedo crear una serie de cada variable (son matrices con dos columnas, por lo que los valores que necesito están en la columna 2)
Mi pregunta es ¿cómo agrego la serie al marco de datos? He revisado la documentación y ninguno de los ejemplos parece encajar con lo que estoy tratando de hacer.
Atentamente,
Ben
No es necesario inicializar un DataFrame vacío (ni siquiera estaba haciendo eso, necesitaría pd.DataFrame()
con los parens).
En cambio, para crear un marco de datos donde cada serie es una columna,
- Haga una lista de series,
series
y -
df = pd.concat(series, axis=1)
horizontalmente condf = pd.concat(series, axis=1)
Algo como:
series = [pd.Series(mat[name][:, 1]) for name in Variables]
df = pd.concat(series, axis=1)
Supongo que de otra manera, posiblemente más rápido, para lograr esto es 1) Use la comprensión de dict para obtener el dictado deseado (es decir, tomando la segunda columna de cada matriz) 2) Luego use pd.DataFrame
para crear una instancia directamente desde el dict sin bucle sobre cada col y concat.
Suponiendo que su mat
vea así (puede ignorarlo ya que su mat
se carga desde el archivo):
In [135]: mat = {''a'': np.random.randint(5, size=(4,2)),
.....: ''b'': np.random.randint(5, size=(4,2))}
In [136]: mat
Out[136]:
{''a'': array([[2, 0],
[3, 4],
[0, 1],
[4, 2]]), ''b'': array([[1, 0],
[1, 1],
[1, 0],
[2, 1]])}
Entonces puedes hacer:
In [137]: df = pd.DataFrame ({name:mat[name][:,1] for name in mat})
In [138]: df
Out[138]:
a b
0 0 0
1 4 1
2 1 0
3 2 1
[4 rows x 2 columns]