Membangun panda DataFrame dari nilai dalam variabel memberikan "ValueError: Jika menggunakan semua nilai skalar, Anda harus melewati indeks"

370

Ini mungkin pertanyaan sederhana, tapi saya tidak tahu bagaimana melakukan ini. Katakanlah saya memiliki dua variabel sebagai berikut.

a = 2
b = 3

Saya ingin membuat DataFrame dari ini:

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

Ini menghasilkan kesalahan:

ValueError: Jika menggunakan semua nilai skalar, Anda harus melewati indeks

Saya mencoba ini juga:

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

Ini memberikan pesan kesalahan yang sama.

Nilani Algiriyage
sumber

Jawaban:

572

Pesan kesalahan mengatakan bahwa jika Anda melewati nilai skalar, Anda harus melewati indeks. Jadi, Anda tidak dapat menggunakan nilai skalar untuk kolom - misalnya menggunakan daftar:

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

atau gunakan nilai skalar dan lewati indeks:

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3
DSM
sumber
7
Mungkin karena urutan item dalam daftar di Python persisten sedangkan urutan item dalam kamus tidak. Anda dapat membuat Instantiate DataFrame dengan kamus kosong. Pada prinsipnya saya kira DataFrame baris tunggal seperti yang ditunjukkan di sini juga akan ok untuk membangun dari kamus karena urutannya tidak masalah (tapi ini belum diterapkan). Namun dengan beberapa baris, Pandas tidak akan dapat membuat DataFrame karena tidak akan tahu item mana yang berasal dari baris yang sama.
Alexander
2
@VitalyIsaev - Dalam hal ini, baris dataframe (diwakili oleh kamus yang diberikan) tidak memiliki indeks (bahkan yang implisit). Solusi sederhana adalah dengan membungkus kamus dalam daftar, yang memang memiliki "pengindeksan alami". Orang dapat mengklaim bahwa jika hanya satu kamus yang diberikan (tanpa daftar pembungkus), maka anggaplah index=0, tetapi itu dapat menyebabkan penyalahgunaan yang tidak disengaja (berpikir bahwa satu kamus entah bagaimana dapat membuat dataframe multi-baris)
Ori
beberapa solusi dalam tautan ini eulertech.wordpress.com/2017/11/28/…
Jason Goal
Alasan untuk ini adalah karena DataFrames dimaksudkan untuk menampung data dua dimensi (yaitu baris dua variabel OP). Jika Anda hanya ingin menahan pasangan indeks -> nilai (seperti Kamus), maka Anda harus menggunakan Seri, seperti yang disarankan Rob .
danuker
Ini adalah sampleframe sampel / baris tunggal, jadi indeks = [0] masuk akal secara logis; tetapi Anda juga bisa memanipulasi menjadi index = [100], yang berfungsi. T: Bukankah Index seharusnya dipesan secara logis secara bertahap, mengapa python memungkinkan manipulasi Index?
Sumanth Lazarus
65

Anda juga dapat menggunakan pd.DataFrame.from_recordsmana yang lebih nyaman ketika Anda sudah memiliki kamus di tangan:

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

Anda juga dapat mengatur indeks, jika diinginkan, dengan:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
fax
sumber
27
Jawaban ini tidak berfungsi untuk saya - saya mendapatkan pesan kesalahan yang sama saat menggunakan from_records.
Dave Kielpinski
Dave, apakah Anda mencoba potongan kode (tentukan a dan b, tentu saja)? Apakah Anda masih mendapatkan pesan kesalahan? Bisakah kamu memposting?
fAX
12
@DaveKielpinski Mungkin Anda lupa menambahkan tanda kurung?
Dennis
Ini akan menggunakan kunci dict sebagai nama kolom. Bagaimana cara mengatur kunci untuk mengindeks?
mingchau
@DaveKielpinski Tolong, periksa apakah Anda melewati daftar ke metode "from_records"; jika tidak, itu tidak akan berfungsi, dan Anda akan mendapatkan pesan kesalahan yang sama seperti ketika Anda memanggil DataFrame di kamus.
mairan
55

Anda harus membuat seri panda terlebih dahulu. Langkah kedua adalah mengubah seri panda menjadi bingkai data panda.

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

Anda bahkan dapat memberikan nama kolom.

pd.Series(data).to_frame('ColumnName')
MLguy
sumber
1
Ini berhasil untuk saya. Kamus saya memiliki kunci integer dan nilai ndarray.
StatsSorceress
pd.Series(data).to_frame('ColumnName')lebih pendek, meskipun padanan ini mungkin lebih langsung:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F
29

Anda dapat mencoba membungkus kamus Anda ke dalam daftar

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

pd.DataFrame([my_dict])

   A  B
0  1  2
NewBie
sumber
8

Mungkin Series akan menyediakan semua fungsi yang Anda butuhkan:

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

DataFrame dapat dianggap sebagai kumpulan dari Seri maka Anda dapat:

  • Menggabungkan beberapa seri menjadi satu bingkai data (seperti dijelaskan di sini )

  • Tambahkan variabel Seri ke dalam kerangka data yang ada ( contoh di sini )

rampok
sumber
7

Anda harus memberikan iterables sebagai nilai untuk kolom DataFrame Pandas:

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

Saya memiliki masalah yang sama dengan array numpy dan solusinya adalah meratakan mereka:

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

df = pd.DataFrame(data)
MicheleDIncecco
sumber
3

Jika Anda ingin mengonversi kamus skalar, Anda harus memasukkan indeks:

import pandas as pd

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

Meskipun indeks tidak diperlukan untuk kamus daftar, ide yang sama dapat diperluas ke kamus daftar:

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)

Tentu saja, untuk kamus daftar, Anda dapat membuat kerangka data tanpa indeks:

planets_df = pd.DataFrame(planets)
print(planets_df)
k0L1081
sumber
3

Kamu bisa mencoba:

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

Dari dokumentasi pada argumen 'orient': Jika kunci dict yang dikirimkan harus berupa kolom dari DataFrame yang dihasilkan, berikan 'kolom' (default). Kalau tidak, jika kunci harus baris, lewati 'indeks'.

Matthew Connell
sumber
Silakan gunakan alat pemformatan untuk mengedit dan memformat pertanyaan / jawaban Anda dengan benar. Kode-kode dalam kalimat harus diformat sebagai code kata-kata Sangat Penting untuk dicetak tebal , huruf - huruf kurang penting Italic Juga gunakan daftar jika perlu
Morse
Ini tidak menyelesaikan pertanyaan yang diajukan, itu menghasilkan hasil yang berbeda dari yang diinginkan.
Ken Williams
3

Sihir panda sedang bekerja. Semua logika keluar.

Pesan kesalahan "ValueError: If using all scalar values, you must pass an index"Mengatakan Anda harus melewati indeks.

Ini tidak berarti lulus indeks membuat panda melakukan apa yang Anda inginkan

Saat Anda melewati indeks, panda akan memperlakukan kunci kamus Anda sebagai nama kolom dan nilai-nilai sebagai apa yang seharusnya berisi kolom untuk masing-masing nilai dalam indeks.

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

    A   B
1   2   3

Melewati indeks yang lebih besar:

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

Indeks biasanya secara otomatis dihasilkan oleh kerangka data ketika tidak ada yang diberikan. Namun, panda tidak tahu berapa banyak baris 2dan yang 3Anda inginkan. Namun Anda bisa lebih eksplisit tentang hal itu

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

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

Indeks bawaannya adalah 0.

Saya akan merekomendasikan selalu melewati kamus daftar ke konstruktor dataframe saat membuat dataframe. Lebih mudah dibaca untuk pengembang lain. Panda memiliki banyak peringatan, jangan buat pengembang lain harus ahli dalam semuanya untuk membaca kode Anda.

firelynx
sumber
3

input tidak harus berupa daftar catatan - itu bisa berupa kamus tunggal juga:

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

Yang tampaknya setara dengan:

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

Ini karena DataFrame memiliki dua dimensi intuitif - kolom dan baris.

Anda hanya menentukan kolom menggunakan tombol kamus.

Jika Anda hanya ingin menentukan data satu dimensi, gunakan Seri!

danuker
sumber
0

Konversi Kamus ke Bingkai Data

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

Beri nama baru ke Kolom

col_dict_df.columns = ['col1', 'col2']
kamran kausar
sumber
-2

Jika Anda memiliki kamus, Anda dapat mengubahnya menjadi bingkai data panda dengan baris kode berikut:

pd.DataFrame({"key": d.keys(), "value": d.values()})
ingrid
sumber
Ini berfungsi, tetapi IMHO itu tidak masuk akal <code> `<! - bahasa: lang-py -> fruits_count = defaultdict (int) fruits_count [" apples "] = 10 fruits_count [" bananas "] = 21 pd.DataFrame ({"key": fruits_count.keys (), "value": fruits_count.values ​​()}) Keluar: nilai kunci 0 (pisang, apel) (21, 10) 1 (pisang, apel) (21, 10) <code>
Emiter
-3

Lewati dikt pada daftar:

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