web-dev-qa-db-fra.com

Pandas DataFrame à la liste de listes

Il est facile de transformer une liste de listes en un cadre de données sur les pandas:

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

Mais comment puis-je reconvertir df en liste de listes?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]
62
bumpkin

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

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]
108
DSM

Si les données contiennent des étiquettes de colonne et d'index que vous souhaitez conserver, vous disposez de 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 méthode tolist() décrite dans d’autres réponses est utile mais ne fournit que les données de base, ce qui peut ne pas être suffisant, selon vos besoins. 

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

Une solution consiste à convertir la DataFrame en json à l'aide de df.to_json(), puis à l'analyser à nouveau. Cela est fastidieux mais présente certains avantages, car la méthode to_json() offre 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]]
}

Encombrant 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 la None comme nom de l'index vous dérange, 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]]
9
Andrew E

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 tâches habituelles du tableau numpy.

5
aps

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

df.reset_index().values.tolist()

Maintenant, pour le recréer ailleurs (par exemple, passer dans une question de débordement de pile):

pd.Dataframe(<data-printed-above>, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)
1
neves

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

list(df.values)
0
Ian Rubenstein