Skip to content

Convertire pandas.DataFrame, Series e list tra loro

Python

pandas.DataFrame, pandas.Series e l’elenco dei tipi integrati di Python possono essere convertiti l’uno nell’altro.

In questo articolo vengono descritti i seguenti contenuti.

  • Converti elenco in pandas.DataFrame, pandas.Series
    • Per l’elenco di soli dati
    • Per l’elenco contenente dati ed etichette (nomi di riga/colonna)
  • Converti panda.DataFrame, panda.Serie in elenco
    • Converti i dati in elenco
    • Converti i dati e l’etichetta (nome riga/colonna) in un elenco
    • Converti etichette (nomi di riga/colonna) in elenco

Converti elenco in pandas.DataFrame, pandas.Series

Per l’elenco di soli dati

Passando un oggetto di tipo elenco al primo argomento di ogni costruttore pandas.DataFrame() e pandas.Series(), pandas.DataFrame e pandas.Series vengono generati in base all’elenco.

Un esempio di generazione di pandas.Series da un elenco unidimensionale è il seguente. È inoltre possibile specificare un’etichetta con l’indice del parametro.

import pandas as pd

l_1d = [0, 1, 2]

s = pd.Series(l_1d)
print(s)
# 0    0
# 1    1
# 2    2
# dtype: int64

s = pd.Series(l_1d, index=['row1', 'row2', 'row3'])
print(s)
# row1    0
# row2    1
# row3    2
# dtype: int64

Un esempio di generazione di pandas.DataFrame da un elenco bidimensionale (elenco di elenchi) è il seguente. È inoltre possibile specificare il nome della riga con l’indice del parametro e il nome della colonna con le colonne dei parametri.

l_2d = [[0, 1, 2], [3, 4, 5]]

df = pd.DataFrame(l_2d)
print(df)
#    0  1  2
# 0  0  1  2
# 1  3  4  5

df = pd.DataFrame(l_2d,
                  index=['row1', 'row2'],
                  columns=['col1', 'col2', 'col3'])
print(df)
#       col1  col2  col3
# row1     0     1     2
# row2     3     4     5

Dopo aver generato pandas.DataFrame e pandas.Series, è possibile impostare e modificare i nomi di riga e colonna aggiornando gli attributi di indice e colonne.

Per l’elenco contenente dati ed etichette (nomi di riga/colonna)

Ecco come generare pandas.Series da un elenco di coppie di etichette e valori.

Suddividilo in un elenco di etichette e un elenco di valori e passali a pandas.Series(). Per i dettagli sull’elaborazione * e zip(), vedere il seguente articolo.

l_1d_index = [['Alice', 0], ['Bob', 1], ['Charlie', 2]]

index, value = zip(*l_1d_index)
print(index)
# ('Alice', 'Bob', 'Charlie')

print(value)
# (0, 1, 2)

s_index = pd.Series(value, index=index)
print(s_index)
# Alice      0
# Bob        1
# Charlie    2
# dtype: int64

Ecco come creare un pandas.DataFrame da un elenco di etichette e più valori.

L’elenco può essere scomposto come nell’esempio precedente di pandas.Series, ma è più semplice impostare l’indice con il metodo set_index() dopo aver letto l’intero elenco.

l_2d_index = [['Alice', 0, 0.0], ['Bob', 1, 0.1], ['Charlie', 2, 0.2]]

df_index = pd.DataFrame(l_2d_index, columns=['name', 'val1', 'val2'])
print(df_index)
#       name  val1  val2
# 0    Alice     0   0.0
# 1      Bob     1   0.1
# 2  Charlie     2   0.2

df_index_set = df_index.set_index('name')
print(df_index_set)
#          val1  val2
# name               
# Alice       0   0.0
# Bob         1   0.1
# Charlie     2   0.2

Se il tipo di dati dtype è diverso per ciascuna colonna come in questo esempio, viene selezionato automaticamente il dtype ottimale per ciascuna colonna.

print(df_index_set.dtypes)
# val1      int64
# val2    float64
# dtype: object

Se l’elenco originale contiene anche nomi di colonna, specifica la prima riga come colonne e la seconda e le righe successive come primo argomento.

l_2d_index_columns = [['name', 'val1', 'val2'], ['Alice', 0, 0.0], ['Bob', 1, 0.1], ['Charlie', 2, 0.2]]

df_index_columns = pd.DataFrame(l_2d_index_columns[1:], columns=l_2d_index_columns[0])
print(df_index_columns)
#       name  val1  val2
# 0    Alice     0   0.0
# 1      Bob     1   0.1
# 2  Charlie     2   0.2

df_index_columns_set = df_index_columns.set_index('name')
print(df_index_columns_set)
#          val1  val2
# name               
# Alice       0   0.0
# Bob         1   0.1
# Charlie     2   0.2

Converti panda.DataFrame, panda.Serie in elenco

Converti i dati in elenco

Non esiste un metodo per richiedere pandas.DataFrame, pandas.Series direttamente in list, ottenere prima l’array NumPy ndarray con l’attributo values, quindi utilizzare il tolist() per utilizzare in list.

s = pd.Series([0, 1, 2])
print(s)
# 0    0
# 1    1
# 2    2
# dtype: int64

l_1d = s.values.tolist()
print(l_1d)
# [0, 1, 2]
df = pd.DataFrame([[0, 1, 2], [3, 4, 5]])
print(df)
#    0  1  2
# 0  0  1  2
# 1  3  4  5

l_2d = df.values.tolist()
print(l_2d)
# [[0, 1, 2], [3, 4, 5]]

L’attributo valori non include le etichette (nomi di riga/colonna).

s_index = pd.Series([0, 1, 2], index=['row1', 'row2', 'row3'])
print(s_index)
# row1    0
# row2    1
# row3    2
# dtype: int64

l_1d = s_index.values.tolist()
print(l_1d)
# [0, 1, 2]
df_index = pd.DataFrame([[0, 1, 2], [3, 4, 5]],
                        index=['row1', 'row2'],
                        columns=['col1', 'col2', 'col3'])
print(df_index)
#       col1  col2  col3
# row1     0     1     2
# row2     3     4     5

l_2d = df_index.values.tolist()
print(l_2d)
# [[0, 1, 2], [3, 4, 5]]

Converti i dati e l’etichetta (nome riga/colonna) in un elenco

Se si desidera mantenere l’etichetta come dati di elenco, reimpostare l’indice con il metodo reset_index().

l_1d_index = s_index.reset_index().values.tolist()
print(l_1d_index)
# [['row1', 0], ['row2', 1], ['row3', 2]]

Poiché non esiste un metodo per ripristinare le colonne, se si desidera mantenere sia il nome della riga che il nome della colonna di pandas.DataFrame come dati di elenco, dopo aver il metodo reset_index(), trasponerlo con .T, applicare nuovamente il applicato metodo reset_index() , quindi ripristinarlo con .T.

l_2d_index = df_index.reset_index().values.tolist()
print(l_2d_index)
# [['row1', 0, 1, 2], ['row2', 3, 4, 5]]

l_2d_index_columns = df_index.reset_index().T.reset_index().T.values.tolist()
print(l_2d_index_columns)
# [['index', 'col1', 'col2', 'col3'], ['row1', 0, 1, 2], ['row2', 3, 4, 5]]

Converti etichette (nomi di riga/colonna) in elenco

Se si desidera solo l’etichetta in un elenco, utilizzare l’attributo index per pandas.Series.

L’attributo index è di tipo Index (tipo RangeIndex nel caso del numero di sequenza predefinita) e ha un metodo tolist().

print(s_index)
# row1    0
# row2    1
# row3    2
# dtype: int64

print(s_index.index)
# Index(['row1', 'row2', 'row3'], dtype="object")

print(type(s_index.index))
# <class 'pandas.core.indexes.base.Index'>

print(s_index.index.tolist())
# ['row1', 'row2', 'row3']

print(type(s_index.index.tolist()))
# <class 'list'>

Allo stesso modo, per pandas.DataFrame, usa l’attributo index per le etichette di riga e l’attributo columns per le etichette di colonna. Entrambi sono di tipo Indice.

print(df_index)
#       col1  col2  col3
# row1     0     1     2
# row2     3     4     5

print(df_index.index)
# Index(['row1', 'row2'], dtype="object")

print(df_index.index.tolist())
# ['row1', 'row2']

print(df_index.columns)
# Index(['col1', 'col2', 'col3'], dtype="object")

print(df_index.columns.tolist())
# ['col1', 'col2', 'col3']

Il tipo Indice può essere utilizzato così com’è e l’elemento può essere ottenuto specificando la posizione con []. In molti casi, non è necessario convertirlo in elenco.

Puoi anche utilizzare le sezioni, ma non puoi modificare gli elementi.

for i in s_index.index:
    print(i, type(i))
# row1 <class 'str'>
# row2 <class 'str'>
# row3 <class 'str'>

print(s_index.index[0])
# row1

print(s_index.index[:2])
# Index(['row1', 'row2'], dtype="object")

# s_index.index[0] = 'ROW1'
# TypeError: Index does not support mutable operations

Usa rename() se vuoi cambiare l’elemento index o columns.