Pandalar DataFrame'i değişkenlerdeki değerlerden oluşturmak “ValueError: Tüm skaler değerleri kullanıyorsanız, bir dizin iletmeniz gerekir”


370

Bu basit bir soru olabilir, ancak bunun nasıl yapılacağını anlayamıyorum. Diyelim ki iki değişkenim var.

a = 2
b = 3

Bundan bir DataFrame oluşturmak istiyorum:

df2 = pd.DataFrame({'A':a,'B':b})

Bu bir hata oluşturur:

ValueError: Tüm skaler değerleri kullanıyorsanız, bir dizin iletmeniz gerekir

Bunu da denedim:

df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()

Bu aynı hata iletisini verir.

Yanıtlar:


571

Hata iletisi, skaler değerleri geçiyorsanız, bir dizin geçirmeniz gerektiğini belirtir. Böylece sütunlar için skaler değerleri kullanamazsınız - örneğin, bir liste kullanın:

>>> df = pd.DataFrame({'A': [a], 'B': [b]})
>>> df
   A  B
0  2  3

veya skaler değerleri kullanın ve bir dizin geçirin:

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3

7
Belki de Python'daki bir listedeki öğelerin sırası kalıcı iken sözlükteki öğelerin sırası değildir. Boş bir sözlükle bir DataFrame başlatabilirsiniz. Prensip olarak, burada gösterildiği gibi tek satırlı bir DataFrame, siparişin önemli olmadığı için bir sözlükten de oluşturulacağını varsayalım (ancak bu uygulanmadı). Bununla birlikte, birden çok satırla Pandalar, aynı satıra hangi öğelerin ait olduğunu bilemeyeceği için bir DataFrame oluşturamaz.
Alexander

2
@VitalyIsaev - Bu durumda, veri çerçevesi satırının (verilen sözlük tarafından temsil edilir) dizini yoktur (örtük olanı bile yoktur). Basit bir çözüm, sözlüğü "doğal indeksleme" içeren bir liste içine sarmaktır. Sadece bir sözlük verilirse (bir kaydırma listesi olmadan), varsayalım index=0, ancak bu yanlışlıkla yanlış kullanıma yol açabilir (tek bir sözlüğün bir şekilde çok satırlı bir veri çerçevesi oluşturabileceğini düşünerek)
Ori

Bu bağlantıda çeşitli çözümler eulertech.wordpress.com/2017/11/28/…
Jason Goal

Bunun nedeni DataFrame'lerin iki boyutlu verileri (yani OP'nin iki değişkeninin satırlarını) tutmasıdır. İndex -> değer çiftlerini (Sözlük gibi) tutmak istiyorsanız, Rob'un önerdiği gibi bir Seri kullanmalısınız .
danuker

Bu tek bir örnek / satır Dataframe'dir, bu nedenle index = [0] mantıklıdır; ancak aynı zamanda çalışan index = [100] olarak da değiştirebilirsiniz. S: Index'in mantıksal olarak aşamalı olarak sipariş edilmesi gerekmiyor, python neden Index manipülasyonuna izin veriyor?
Sumanth Lazarus

65

pd.DataFrame.from_recordsSözlüğü zaten elinizde olduğunda daha uygun olanı da kullanabilirsiniz :

df = pd.DataFrame.from_records([{ 'A':a,'B':b }])

İsterseniz, aşağıdakileri yaparak dizin de ayarlayabilirsiniz:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')

27
Bu cevap benim için çalışmıyor - from_records kullanırken aynı hata mesajını alıyorum.
Dave Kielpinski

Dave, kod parçasını denedin mi (elbette a ve b'yi tanımla)? Hala hata mesajı alıyor musunuz? Gönderebilir misin?
17'de fAX

12
@DaveKielpinski Parantez eklemeyi belki unuttunuz mu?
Dennis

Bu, dict tuşlarını sütun adları olarak kullanacaktır. Anahtarlar dizine nasıl ayarlanır?
mingchau

@DaveKielpinski Lütfen, bir listeyi "from_records" yöntemine iletip iletmediğinizi kontrol edin ; aksi takdirde çalışmaz ve sözlükte DataFrame'i aradığınızda aynı hata iletisini alırsınız.
mairan

55

İlk önce bir panda serisi oluşturmanız gerekir. İkinci adım, panda serilerini panda veri çerçevesine dönüştürmektir.

import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()

Bir sütun adı bile sağlayabilirsiniz.

pd.Series(data).to_frame('ColumnName')

1
Bu benim için çalıştı. Sözlüğümde tamsayı anahtarları ve ndarray değerleri vardı.
İstatistiklerSorceress

pd.Series(data).to_frame('ColumnName')Bu eşdeğer belki de daha doğrudan olmasına rağmen daha kısadır:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

Sözlüğünüzü listeye kaydırmayı deneyebilirsiniz

my_dict = {'A':1,'B':2}

pd.DataFrame([my_dict])

   A  B
0  1  2

8

Belki Seri ihtiyacınız olan tüm fonksiyonları sağlar:

pd.Series({'A':a,'B':b})

DataFrame bir Seri koleksiyonu olarak düşünülebilir, böylece şunları yapabilirsiniz:

  • Birden fazla Seriyi tek bir veri çerçevesinde birleştirin ( burada açıklandığı gibi )

  • Mevcut veri çerçevesine bir Seri değişkeni ekleme ( örnek burada )


7

Pandas DataFrame sütunlarının değerleri olarak yinelenebilir öğeler sağlamanız gerekir:

df2 = pd.DataFrame({'A':[a],'B':[b]})

6

Numpy dizileri ile aynı sorunu yaşadım ve çözüm onları düzleştirmek:

data = {
    'b': array1.flatten(),
    'a': array2.flatten(),
}

df = pd.DataFrame(data)

3

Bir skaler sözlüğünü dönüştürmek istiyorsanız, bir dizin eklemeniz gerekir:

import pandas as pd

alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)

Bir liste sözlüğü için dizin gerekli olmasa da, aynı fikir bir liste sözlüğüne genişletilebilir:

planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']}
index = [0, 1, 2]
planets_df = pd.DataFrame(planets, index=index)
print(planets_df)

Tabii ki, listeler sözlüğü için veri çerçevesini bir dizin olmadan oluşturabilirsiniz:

planets_df = pd.DataFrame(planets)
print(planets_df)

3

Deneyebilirsiniz:

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')

'Orient' argümanındaki belgelerden: Geçilen diktenin anahtarları sonuçta elde edilen DataFrame sütunlarıysa, 'sütunlar' (varsayılan) değerini iletin. Aksi takdirde anahtarların satır olması gerekiyorsa, 'index' iletin.


Sorunuzu / yanıtınızı düzgün bir şekilde düzenlemek ve biçimlendirmek için lütfen biçimlendirme araçlarını kullanın. Cümleler içindeki kodlar, code Çok Önemli kelimeler kalın olacak , daha az önemli olan italik olarak biçimlendirilmelidir. Gerekirse listeleri kullanın
Morse

Bu, sorulan soruyu çözmez, istenenden farklı bir sonuç üretir.
Ken Williams

3

Pandalar büyü iş başında. Tüm mantık çıktı.

Hata iletisi "ValueError: If using all scalar values, you must pass an index"bir dizin iletmeniz gerektiğini söyler.

Bu mutlaka bir dizini geçmek anlamına gelmez pandaların yapmak istediğiniz şeyi yapmasını sağlar

Bir dizini ilettiğinizde, pandalar sözlük anahtarlarınızı sütun adları ve değerleri, dizindeki her bir değer için sütunun içermesi gerektiği gibi ele alır.

a = 2
b = 3
df2 = pd.DataFrame({'A':a,'B':b}, index=[1])

    A   B
1   2   3

Daha büyük bir dizin geçirme:

df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4])

    A   B
1   2   3
2   2   3
3   2   3
4   2   3

Bir dizin genellikle hiçbir veri verilmediğinde otomatik olarak bir veri çerçevesi tarafından oluşturulur. Ancak, pandalar kaç sıra 2ve 3istediğinizi bilmiyor . Ancak bununla ilgili daha açık olabilirsiniz

df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4})
df2

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

Varsayılan dizin yine de 0'dır.

Dataframe oluştururken her zaman listelerin sözlüğünü dataframe yapıcısına iletmenizi tavsiye ederim. Diğer geliştiriciler için okumak daha kolaydır. Pandaların çok fazla uyarısı var, kodunuzu okumak için diğer geliştiricilerin hepsinde uzmanlara sahip olmalarını sağlayın.


3

girişin bir kayıt listesi olması gerekmez - tek bir sözlük de olabilir:

pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
   a  b
0  1  2

Hangi şuna eşit gibi görünüyor:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2

2

Bunun nedeni, bir DataFrame öğesinin iki sezgisel boyutu olmasıdır - sütunlar ve satırlar.

Sütunları yalnızca sözlük tuşlarını kullanarak belirlersiniz.

Yalnızca bir boyutlu veri belirtmek istiyorsanız, bir Seri kullanın!


0

Sözlüğü Veri Çerçevesine Dönüştür

col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()

Sütuna yeni bir ad verin

col_dict_df.columns = ['col1', 'col2']

-2

Bir sözlüğünüz varsa, aşağıdaki kod satırına sahip bir panda veri çerçevesine dönüştürebilirsiniz:

pd.DataFrame({"key": d.keys(), "value": d.values()})

Çalışıyor, ancak IMHO pek mantıklı değil <code> `<! - dil: lang-py -> fruit_count = defaultdict (int) fruit_count [" elmalar "] = 10 fruit_count [" muz "] = 21 pd.DataFrame ({"key": fruit_count.keys (), "value": fruit_count.values ​​()}) Çıkış: anahtar / değer 0 (muz, elma) (21, 10) 1 (muz, elma) (21, 10) <code>
Emiter

-3

Sadece bir listeye karar verin:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
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.