Pandas DataFrame à la liste des listes

115

Il est facile de transformer une liste de listes en un dataframe pandas:

import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,5]])

Mais comment puis-je transformer df en une liste de listes?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]
plouc
la source

Réponses:

178

Vous pouvez accéder au tableau sous-jacent et appeler sa tolistméthode:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]
DSM
la source
Pourquoi y a-t-il des Lajouts dans la sortie?
Kunal Vyas
1
L signifie long, par opposition à int.
user48956
1
REMARQUE, cela ne préserve pas l'ordre des colonnes. alors méfiez-vous de cela
Russell Lego
3
Il n'y a aucune raison pour laquelle il ne conserverait pas l'ordre des colonnes.
Yohan Obadia
15

Si les données ont des étiquettes de colonne et d'index que vous souhaitez conserver, il existe quelques options.

Exemple de données:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]], \
       columns=('first', 'second', 'third'), \
       index=('alpha', 'beta')) 
>>> df
       first  second  third
alpha      1       2      3
beta       3       4      5

La tolist()méthode décrite dans d'autres réponses est utile mais ne fournit que les données de base - ce qui peut ne pas suffire, selon vos besoins.

>>> df.values.tolist()
[[1, 2, 3], [3, 4, 5]]

Une approche consiste à convertir le DataFrameen json en utilisant df.to_json(), puis à l'analyser à nouveau. Ceci est lourd mais présente certains avantages, car la to_json()méthode comporte des options utiles.

>>> df.to_json()
{
  "first":{"alpha":1,"beta":3},
  "second":{"alpha":2,"beta":4},"third":{"alpha":3,"beta":5}
}

>>> df.to_json(orient='split')
{
 "columns":["first","second","third"],
 "index":["alpha","beta"],
 "data":[[1,2,3],[3,4,5]]
}

Lourd mais peut être utile.

La bonne nouvelle est qu'il est assez simple de créer des listes pour les colonnes et les lignes:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> rows = [[i for i in row] for row in df.itertuples()]

Cela donne:

>>> print(f"columns: {columns}\nrows: {rows}") 
columns: [None, 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

Si le Nonenom de l'index est gênant, renommez-le:

df = df.rename_axis('stage')

Ensuite:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> print(f"columns: {columns}\nrows: {rows}") 

columns: ['stage', 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]
Andrew E
la source
1
Si vous avez un index à plusieurs niveaux, le tuple d'index sera le premier élément des lignes générées. Vous aurez besoin d'une étape supplémentaire pour le diviser.
Konstantin
Ne serait-il pas plus simple à utiliser DataFrame.itertuples()ou DataFrame.to_records()pour tout cela?
AMC
@AMC Peut-être, je ne sais pas, peut-être? Plutôt que de pontifier, pourquoi ne pas ajouter un traitement approprié de cette pensée dans votre propre réponse?
Andrew E le
@AndrewE Eh, cela vaut toujours la peine de discuter et d'améliorer les réponses existantes.
AMC le
5

Je ne sais pas si cela répondra à vos besoins, mais vous pouvez aussi faire:

>>> lol = df.values
>>> lol
array([[1, 2, 3],
       [3, 4, 5]])

Ceci est juste un tableau numpy du module ndarray, qui vous permet de faire toutes les choses habituelles du tableau numpy.

aps
la source
1
Plus 1. En pratique , il n'est souvent pas nécessaire de convertir le tableau NumPy en une liste de listes.
jpp
5

Je voulais conserver l'index, j'ai donc adapté la réponse originale à cette solution:

list_df = df.reset_index().values.tolist()

Vous pouvez maintenant le coller ailleurs (par exemple pour le coller dans une question de Stack Overflow) et le recréer ultérieurement:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)
neves
la source
2

Peut-être que quelque chose a changé mais cela a rendu une liste de ndarrays qui ont fait ce dont j'avais besoin.

list(df.values)
Ian Rubenstein
la source
1

Remarque: j'ai vu de nombreux cas sur Stack Overflow où la conversion d'une série Pandas ou d'un DataFrame en un tableau NumPy ou des listes Python simples est totalement inutile. Si vous êtes nouveau dans la bibliothèque, pensez à vérifier si la fonctionnalité dont vous avez besoin est déjà offerte par ces objets Pandas.

Pour citer un commentaire de @jpp:

En pratique , il n'est souvent pas nécessaire de convertir le tableau NumPy en une liste de listes.


Si un Pandas DataFrame / Series ne fonctionne pas, vous pouvez utiliser les méthodes intégrées DataFrame.to_numpyet Series.to_numpy.

AMC
la source
1
Cette réponse ne représente guère plus que vos propres croyances. Et franchement, c'est un peu gênant. Il y a des raisons parfaitement valables de convertir un dataframe en liste / tableau, un utilisateur avancé le saurait certainement.
Nicolas Gervais
@NicolasGervais C'est peut-être un peu trop, oui, je vais le modifier pour moins généraliser. Il y a des raisons parfaitement valables de convertir un dataframe en liste / tableau Bien sûr, ma réponse ne dit rien du contraire. un utilisateur avancé le saurait certainement. Je ne vois pas l'intérêt de ce coup. J'ai écrit cette réponse après avoir remarqué que de nombreuses personnes convertissaient des séries en ndarrays ou listes, et des ndarrays en listes, simplement parce qu'ils ne savaient pas quelles opérations ces objets supportaient.
AMC
Je fais référence à des cas très flagrants, comme le faire for elem in some_series.values.tolist():parce qu'ils ne savent pas que vous pouvez parcourir les éléments d'une série. Je ne sais pas ce qui est si horrible dans cette réponse.
AMC
0

C'est très simple:

import numpy as np

list_of_lists = np.array(df)
Tms91
la source
En quoi est-ce différent d'utiliser DataFrame.valuesou DataFrame.to_numpy()? Peu importe le fait qu'il crée un tableau NumPy, pas une simple liste Python.
AMC le
0

"df.values" renvoie un tableau numpy. Cela ne préserve pas les types de données. Un entier peut être converti en flottant.

df.iterrows () retourne une série qui ne garantit pas non plus la conservation des types de données. Voir: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html

Le code ci-dessous se convertit en une liste de liste et préserve les types de données:

rows = [list(row) for row in df.itertuples()]
e1i45
la source
-1

Nous pouvons utiliser la fonction DataFrame.iterrows () pour parcourir chacune des lignes du Dataframe donné et construire une liste à partir des données de chaque ligne:

# Empty list 
row_list =[] 

# Iterate over each row 
for index, rows in df.iterrows(): 
    # Create list for the current row 
    my_list =[rows.Date, rows.Event, rows.Cost] 

    # append the list to the final list 
    row_list.append(my_list) 

# Print 
print(row_list) 

Nous pouvons extraire avec succès chaque ligne de la trame de données donnée dans une liste

Ram Prajapati
la source
Ce n'est pas une bonne idée, essayez d'éviter d'utiliser df.iterrows car il est anti-pattern et lent une fois que le df devient grand: stackoverflow.com/questions/16476924/...
Derek O