Pandas DataFrame в список списков


116

Список списков легко превратить в фреймворк pandas:

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

Но как мне снова превратить df в список списков?

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

Ответы:


179

Вы можете получить доступ к базовому массиву и вызвать его tolistметод:

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

Почему Lв выводе добавлено s?
Kunal Vyas

1
L означает long, в отличие от int.
user48956


1
ПРИМЕЧАНИЕ, это не сохраняет порядок столбцов. так что берегитесь
Рассел Лего

3
Нет причин, по которым он не сохранил бы порядок столбцов.
Йохан Обадиа

15

Если у данных есть метки столбцов и индексов, которые вы хотите сохранить, есть несколько вариантов.

Пример данных:

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

tolist()Описано в других ответах метод полезен , но дает только основные данные - которые не могут быть достаточно, в зависимости от ваших потребностей.

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

Один из подходов - преобразовать DataFrameфайл в json с помощью, df.to_json()а затем снова проанализировать его. Это громоздко, но имеет некоторые преимущества, поскольку у этого to_json()метода есть несколько полезных опций.

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

Громоздко, но может быть полезно.

Хорошая новость заключается в том, что создавать списки для столбцов и строк довольно просто:

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

Это дает:

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

Если Noneas имя индекса надоедает, переименуйте его:

df = df.rename_axis('stage')

Затем:

>>> 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
Если у вас многоуровневый индекс, кортеж индекса будет первым элементом сгенерированных строк. Вам понадобится следующий шаг, чтобы разделить его.
Константин

Не было бы проще использовать DataFrame.itertuples()или DataFrame.to_records()все это?
AMC,

@AMC Может быть, я не знаю, может быть? Почему бы вместо понтификата не добавить в свой ответ надлежащую трактовку этой мысли?
Эндрю Э,

@AndrewE Эх, все еще стоит обсудить и улучшить существующие ответы.
AMC

6

Я хотел сохранить индекс, поэтому адаптировал исходный ответ к этому решению:

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

Теперь вы можете вставить его в другое место (например, вставить в вопрос о переполнении стека), а затем воссоздать его:

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

5

Не знаю, подойдет ли он вашим потребностям, но вы также можете:

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

Это просто массив numpy из модуля ndarray, который позволяет вам делать все обычные вещи с массивами numpy.


1
Плюс 1. На практике часто нет необходимости преобразовывать массив NumPy в список списков.
jpp 03

2

Возможно, что-то изменилось, но это вернуло список ndarrays, которые сделали то, что мне нужно.

list(df.values)

1

Примечание: я видел много случаев в Stack Overflow, когда преобразование серии Pandas или DataFrame в массив NumPy или простые списки Python совершенно не нужно. Если вы новичок в библиотеке, подумайте о том, чтобы дважды проверить, предлагаются ли уже нужные вам функции этими объектами Pandas.

Чтобы процитировать комментарий @jpp:

На практике часто нет необходимости преобразовывать массив NumPy в список списков.


Если Панды DataFrame / серия не будет работать, вы можете использовать встроенный DataFrame.to_numpyи Series.to_numpyметоду.


1
Этот ответ представляет собой немного больше, чем ваши собственные убеждения. И, честно говоря, это немного смущает. Существуют вполне веские причины для преобразования фрейма данных в список / массив, о которых опытный пользователь наверняка знает.
Николя Жерве,

@NicolasGervais Это может быть многовато, да, я отредактирую, чтобы меньше обобщать. Существуют вполне веские причины для преобразования фрейма данных в список / массив. Конечно, мой ответ на самом деле ничего не говорит об обратном. опытный пользователь наверняка знает. Я не вижу смысла в этом джебе. Я написал этот ответ после того, как заметил, что многие люди конвертируют ряды в ndarrays или списки и ndarrays в списки просто потому, что они не знали, какие операции поддерживают эти объекты.
AMC

Я имею в виду очень вопиющие случаи, вроде делания, for elem in some_series.values.tolist():потому что они не знают, что вы можете перебирать элементы серии. Я не уверен, что такого ужасного в этом ответе.
AMC

0

Это очень просто:

import numpy as np

list_of_lists = np.array(df)

Чем это отличается от использования DataFrame.valuesили DataFrame.to_numpy()? Неважно, что он создает массив NumPy, а не простой список Python.
AMC

0

"df.values" возвращает массив numpy. Это не сохраняет типы данных. Целое число может быть преобразовано в число с плавающей запятой.

df.iterrows () возвращает ряд, который также не гарантирует сохранение типов данных. См. Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html

Приведенный ниже код преобразуется в список списка и сохраняет типы данных:

rows = [list(row) for row in df.itertuples()]

-1

Мы можем использовать функцию DataFrame.iterrows () для перебора каждой из строк данного Dataframe и построения списка из данных каждой строки:

# 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) 

Мы можем успешно извлечь каждую строку данного фрейма данных в список


Это не лучшая идея, старайтесь избегать использования df.iterrows, потому что это анти-шаблон и медленное, когда df становится большим: stackoverflow.com/questions/16476924/…
Дерек О
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.