Listeler Listesi için Pandas DataFrame


116

Bir liste listesini pandalar veri çerçevesine dönüştürmek kolaydır:

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

Ama df'yi bir liste listesine nasıl geri dönüştürebilirim?

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

Yanıtlar:


179

Temel diziye erişebilir ve tolistyöntemini çağırabilirsiniz :

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

Çıktıya neden Leklenen e-postalar var ?
Kunal Vyas

1
Demek istediğim, int'in aksine uzun.
user48956


1
NOT, bu sütun sırasını korumaz. bu yüzden buna dikkat edin
Russell Lego

3
Sütun sırasını korumaması için hiçbir neden yok.
Yohan Obadia

15

Verilerin korumak istediğiniz sütun ve dizin etiketleri varsa, birkaç seçenek vardır.

Örnek veriler:

>>> 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()Diğer yanıtlar tarif edilen yöntem yararlıdır ancak verimler sadece çekirdek veri - daki ihtiyaçlarına bağlı olarak, yeterli olmayabilir olan.

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

Bir yaklaşım, DataFramekullanarak json'a dönüştürmek df.to_json()ve sonra tekrar ayrıştırmaktır. Bu külfetli bir işlemdir ancak bazı avantajları vardır, çünkü to_json()yöntemin bazı yararlı seçenekleri vardır.

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

Hantal ama yararlı olabilir.

İyi haber şu ki, sütunlar ve satırlar için listeler oluşturmak oldukça basittir:

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

Bu, şunları verir:

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

Eğer Nonedizinin adı can sıkıcı olduğu gibi yeniden adlandırın:

df = df.rename_axis('stage')

Sonra:

>>> 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
Çok düzeyli bir dizininiz varsa, dizin demeti, oluşturulan satırların ilk öğesi olacaktır. Bölmek için daha ileri bir adıma ihtiyacınız olacak.
Konstantin

Kullanımı daha kolay olmaz mı DataFrame.itertuples()ya DataFrame.to_records()bütün bunlar için?
AMC

@AMC Belki, bilmiyorum, belki? Papalıktan vazgeçmek yerine, neden kendi cevabınıza bu düşünceyi uygun bir şekilde ele almıyorsunuz?
Andrew E

@AndrewE Eh, hala tartışmaya ve mevcut cevapları geliştirmeye değer.
AMC

6

Dizini korumak istedim, bu yüzden orijinal cevabı bu çözüme uyarladım:

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

Şimdi onu başka bir yere yapıştırabilir (örneğin bir Stack Overflow sorusuna yapıştırabilir) ve sonra onu yeniden oluşturabilirsiniz:

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

5

İhtiyaçlarınıza uyup uymayacağını bilmiyorum, ancak şunları da yapabilirsiniz:

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

Bu, ndarray modülünden gelen, tüm olağan numpy dizi şeylerini yapmanıza izin veren, sadece uyuşmuş bir dizidir.


1
Artı 1. Pratikte , NumPy dizisini liste listesine dönüştürmeye genellikle gerek yoktur.
jpp

2

Belki bir şeyler değişti ama bu, ihtiyacım olanı yapan bir ndarray listesi verdi.

list(df.values)

1

Not: Stack Overflow'da Pandas Series veya DataFrame'i NumPy dizisine veya düz Python listelerine dönüştürmenin tamamen gereksiz olduğu birçok durum gördüm. Kitaplıkta yeniyseniz, ihtiyacınız olan işlevselliğin bu Pandas nesneleri tarafından zaten sunulup sunulmadığını iki kez kontrol etmeyi düşünün.

@Jpp tarafından bir yorum alıntılamak için:

Pratikte , NumPy dizisini bir liste listesine dönüştürmeye genellikle gerek yoktur.


Bir Pandas DataFrame / Serisi çalışmazsa, yerleşik DataFrame.to_numpyve Series.to_numpyyöntemleri kullanabilirsiniz.


1
Bu cevap, kendi inançlarınızdan biraz daha fazlasını temsil ediyor. Ve açıkçası, bu biraz utanç verici. Bir veri çerçevesini bir listeye / diziye dönüştürmek için tamamen geçerli nedenler vardır, ileri düzey bir kullanıcı kesinlikle bilir.
Nicolas Gervais

@NicolasGervais Biraz fazla olabilir, evet, daha az genellemek için düzenleyeceğim. Bir veri çerçevesini bir listeye / diziye dönüştürmek için tamamen geçerli nedenler var Elbette, cevabım tam tersini söylemiyor. ileri düzey bir kullanıcı kesinlikle bilirdi. O aşının amacını anlamıyorum. Bu cevabı, birçok insanın dizileri ndara veya listelere ve ndarray'leri listelere dönüştürdüğünü fark ettikten sonra yazdım, çünkü bu nesnelerin hangi işlemleri desteklediğinin farkında değillerdi.
AMC

Yapmak gibi çok bariz vakalardan bahsediyorum for elem in some_series.values.tolist():çünkü onlar bir serinin unsurlarını yineleyebileceğinizi bilmiyorlar. Bu cevabın neyin bu kadar kötü olduğundan emin değilim.
AMC

0

Bu çok basit:

import numpy as np

list_of_lists = np.array(df)

Bunun DataFrame.valuesveya kullanmaktan farkı DataFrame.to_numpy()nedir? Düz bir Python listesi değil, bir NumPy dizisi oluşturduğu gerçeğini boşverin.
AMC


-1

Verilen Dataframe'in her satırını yinelemek ve her satırın verilerinden bir liste oluşturmak için DataFrame.iterrows () işlevini kullanabiliriz:

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

Verilen veri çerçevesinin her satırını bir listeye başarıyla çıkarabiliriz


Bu iyi bir fikir değil, df.iterrows'u kullanmaktan kaçınmaya çalışın çünkü bu anti-paterndir ve df büyüdükten sonra yavaşlar: stackoverflow.com/questions/16476924/…
Derek O
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.