Pandas DataFrame do listy list

115

Łatwo jest zmienić listę list w ramkę danych pandy:

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

Ale jak zmienić df z powrotem w listę list?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]
gamoń
źródło

Odpowiedzi:

178

Możesz uzyskać dostęp do podstawowej tablicy i wywołać jej tolistmetodę:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]
DSM
źródło
Dlaczego Lna wyjściu są dołączane s?
Kunal Vyas
1
L oznacza długi, w przeciwieństwie do int.
user48956
1
UWAGA, nie zachowuje to kolejności kolumn. więc uważaj na to
Russell Lego
3
Nie ma powodu, dla którego nie miałoby to zachowywać kolejności kolumn.
Yohan Obadia
15

Jeśli dane mają etykiety kolumn i indeksów, które chcesz zachować, istnieje kilka opcji.

Przykładowe dane:

>>> 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()Metoda opisana w innych odpowiedzi jest przydatne, ale przynosi tylko podstawowe dane - co może nie wystarczyć, w zależności od potrzeb.

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

Jednym ze sposobów jest przekonwertowanie na DataFramejson przy użyciu, df.to_json()a następnie ponowne przeanalizowanie. Jest to kłopotliwe, ale ma pewne zalety, ponieważ to_json()metoda ta ma kilka przydatnych opcji.

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

Uciążliwe, ale mogą być przydatne.

Dobra wiadomość jest taka, że ​​tworzenie list dla kolumn i wierszy jest całkiem proste:

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

To daje:

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

Jeśli Nonenazwa indeksu jest uciążliwa, zmień jej nazwę:

df = df.rename_axis('stage')

Następnie:

>>> 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.
źródło
1
Jeśli masz indeks wielopoziomowy, krotka indeksu będzie pierwszym elementem wygenerowanych wierszy. Będziesz potrzebować dalszego kroku, aby go podzielić.
Konstantin
Czy nie byłoby prostsze w użyciu, DataFrame.itertuples()czy DataFrame.to_records()do tego wszystkiego?
AMC
@AMC Może, nie wiem, może? Zamiast pontyfikować, dlaczego nie dodać odpowiedniego potraktowania tej myśli do własnej odpowiedzi?
Andrew E
@AndrewE Ech, nadal warto omawiać i ulepszać istniejące odpowiedzi.
AMC
6

Chciałem zachować indeks, więc oryginalną odpowiedź dostosowałem do tego rozwiązania:

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

Teraz możesz wkleić go gdzie indziej (np. Aby wkleić do pytania Stack Overflow), a następnie odtworzyć:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)
neves
źródło
5

Nie wiem, czy będzie pasować do Twoich potrzeb, ale możesz też:

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

To jest po prostu tablica numpy z modułu ndarray, która pozwala ci robić wszystkie zwykłe tablice numpy.

aps
źródło
1
Plus 1. W praktyce często nie ma potrzeby przekształcania tablicy NumPy w listę list.
jpp
2

Może coś się zmieniło, ale to dało listę ndarrayów, które zrobiły to, czego potrzebowałem.

list(df.values)
Ian Rubenstein
źródło
1

Uwaga: widziałem wiele przypadków przepełnienia stosu, w których konwersja serii Pandas lub DataFrame do tablicy NumPy lub zwykłych list Pythona jest całkowicie niepotrzebna. Jeśli jesteś nowy w bibliotece, rozważ podwójne sprawdzenie, czy potrzebna funkcjonalność jest już oferowana przez te obiekty Pandas.

Cytując komentarz @jpp:

W praktyce często nie ma potrzeby konwertowania tablicy NumPy na listę list.


Jeśli Pandas DataFrame / Series nie będzie działać, możesz użyć wbudowanych DataFrame.to_numpyi Series.to_numpymetod.

AMC
źródło
1
Ta odpowiedź reprezentuje niewiele więcej niż twoje własne przekonania. I szczerze mówiąc, to trochę zawstydzające. Zaawansowany użytkownik z pewnością wie, że istnieją całkowicie uzasadnione powody, aby przekonwertować ramkę danych na listę / tablicę.
Nicolas Gervais
@NicolasGervais To może być trochę za dużo, tak, edytuję to, aby mniej uogólniać. Istnieją całkowicie uzasadnione powody, aby przekonwertować ramkę danych na listę / tablicę. Oczywiście moja odpowiedź nie mówi nic przeciwnego. zaawansowany użytkownik z pewnością by wiedział. Nie widzę sensu tego dźgnięcia. Napisałem tę odpowiedź po tym, jak zauważyłem, że wiele osób konwertowało serie na ndarraye lub listy, a ndarrays na listy, po prostu dlatego, że nie wiedzieli, jakie operacje te obiekty obsługują.
AMC
Mam na myśli bardzo rażące przypadki, takie jak robienie, for elem in some_series.values.tolist():ponieważ nie wiedzą, że można iterować po elementach serii. Nie jestem pewien, co jest takiego okropnego w tej odpowiedzi.
AMC
0

To jest bardzo proste:

import numpy as np

list_of_lists = np.array(df)
Tms91
źródło
Czym to się różni od używania DataFrame.valueslub DataFrame.to_numpy()? Nieważne, że tworzy tablicę NumPy, a nie zwykłą listę Pythona.
AMC
0

„df.values” zwraca tablicę numpy. Nie zachowuje to typów danych. Liczba całkowita może zostać przekonwertowana na liczbę zmiennoprzecinkową.

df.iterrows () zwraca serię, która również nie gwarantuje zachowania typów danych. Zobacz: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html

Poniższy kod konwertuje do listy list i zachowuje typy danych:

rows = [list(row) for row in df.itertuples()]
e1i45
źródło
-1

Możemy użyć funkcji DataFrame.iterrows () do iteracji po każdym z wierszy danej Dataframe i skonstruowania listy z danych każdego wiersza:

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

Możemy z powodzeniem wyodrębnić każdy wiersz danej ramki danych do listy

Ram Prajapati
źródło
To nie jest dobry pomysł, staraj się unikać używania df.iterrows, ponieważ jest anty-wzorzec i powolny, gdy df stanie się duży: stackoverflow.com/questions/16476924/ ...
Derek O