2015-01-18 5 views
38

Это легко превратить список списков в панде dataframe:Панды DataFrame к списку списков

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

Но как я перехожу ДФ обратно в список списков?

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

lol at lol variable –

ответ

67

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

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

Perfect. Благодаря! – bumpkin

+0

Почему в выводе есть 'L '? –

+1

L означает long, а не int. – user48956

2

Я не знаю, если это будет соответствовать вашим потребностям, но вы также можете сделать:

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

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

3

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

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

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

Если None как имя индекса надоедливым, переименовать его:

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

Если у вас многоуровневый индекс, то индексный кортеж будет первым элементом сгенерированных строк. Вам понадобится еще один шаг, чтобы разделить его. – Konstantin

Смежные вопросы