
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.