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]]

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]]

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]]

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.


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)

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)

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.


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)

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


-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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.