
pandas.DataFrame, pandas.Series et la liste de types intégrée de Python peuvent être convertis l’un à l’autre.
Cet article décrit le contenu suivant.
- Convertir la liste en pandas.DataFrame, pandas.Series
- Pour la liste de données uniquement
- Pour une liste contenant des données et des étiquettes (noms de lignes/colonnes)
- Convertir pandas.DataFrame, pandas.Series en liste
- Convertir les données en liste
- Convertir les données et l’étiquette (nom de ligne/colonne) en liste
- Convertir les étiquettes (noms de ligne/colonne) en liste
Convertir la liste en pandas.DataFrame, pandas.Series
Pour la liste de données uniquement
En passant un objet de type liste au premier argument de chaque constructeur pandas.DataFrame() et pandas.Series(), pandas.DataFrame et pandas.Series sont générés en fonction de la liste.
Voici un exemple de génération de pandas.Series à partir d’une liste unidimensionnelle. Vous pouvez également spécifier une étiquette avec le paramètre index.
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 exemple de génération de pandas.DataFrame à partir d’une liste à deux dimensions (liste de listes) est le suivant. Vous pouvez également spécifier le nom de la ligne avec le paramètre index et le nom de la colonne avec le paramètrecolumns.
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
Après avoir généré pandas.DataFrame et pandas.Series, vous pouvez définir et modifier les noms de ligne et de colonne en mettant à jour les attributs d’index et de colonnes.
Pour une liste contenant des données et des étiquettes (noms de lignes/colonnes)
Voici comment générer pandas.Series à partir d’une liste de paires d’étiquettes et de valeurs.
Décomposez-le en une liste d’étiquettes et une liste de valeurs et transmettez-les à pandas.Series(). Pour plus de détails sur le traitement à l’aide de * et zip(), consultez l’article suivant.
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
Voici comment créer un pandas.DataFrame à partir d’une liste d’étiquettes et de plusieurs valeurs.
La liste peut être décomposée comme dans l’exemple ci-dessus de pandas.Series, mais il est plus facile de définir l’index avec la méthode set_index() après avoir lu toute la liste.
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
Si le type de données dtype est différent pour chaque colonne comme dans cet exemple, le dtype optimal pour chaque colonne est automatiquement sélectionné.
print(df_index_set.dtypes)
# val1 int64
# val2 float64
# dtype: object
Si la liste d’origine contient également des noms de colonnes, spécifiez la première ligne en tant que colonnes et la deuxième ligne et les suivantes en tant que premier argument.
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
Convertir pandas.DataFrame, pandas.Series en liste
Convertir les données en liste
Puisqu’il n’y a pas de méthode pour convertir pandas.DataFrame, pandas.Series directement en liste, obtenez d’abord le tableau NumPy ndarray avec l’attribut values, puis utilisez la méthode tolist() pour convertir en liste.
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’attribut values n’inclut pas les étiquettes (noms de lignes/colonnes).
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]]
Convertir les données et l’étiquette (nom de ligne/colonne) en liste
Si vous souhaitez conserver l’étiquette en tant que données de liste, réinitialisez l’index avec la méthode reset_index().
l_1d_index = s_index.reset_index().values.tolist()
print(l_1d_index)
# [['row1', 0], ['row2', 1], ['row3', 2]]
Puisqu’il n’y a pas de méthode pour réinitialiser les colonnes, si vous souhaitez conserver à la fois le nom de la ligne et le nom de la colonne de pandas.DataFrame en tant que données de liste, après avoir appliqué la méthode reset_index(), transposez-la avec .T, appliquez à nouveau la méthode reset_index() , puis restaurez-le avec .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]]
Convertir les étiquettes (noms de ligne/colonne) en liste
Si vous souhaitez convertir uniquement l’étiquette en liste, utilisez l’attribut index pour pandas.Series.
L’attribut index est de type Index (type RangeIndex dans le cas du numéro de séquence par défaut) et possède une méthode 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'>
De même, pour pandas.DataFrame, utilisez l’attribut index pour les étiquettes de ligne et l’attribut columns pour les étiquettes de colonne. Les deux sont de type Index.
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']
Le type Index peut être utilisé tel quel dans for, et l’élément peut être obtenu en spécifiant la position avec []. Dans de nombreux cas, il n’est pas nécessaire de le convertir en liste.
Vous pouvez également utiliser des tranches, mais vous ne pouvez pas modifier les éléments.
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
Utilisez rename() si vous souhaitez modifier l’élément d’index ou de colonnes.