การสร้าง Panda DataFrame จากค่าในตัวแปรให้“ ValueError: หากใช้ค่าสเกลาร์ทั้งหมดคุณต้องผ่านดัชนี”


370

นี่อาจเป็นคำถามง่าย ๆ แต่ฉันไม่สามารถหาวิธีทำสิ่งนี้ได้ ให้บอกว่าฉันมีสองตัวแปรดังนี้

a = 2
b = 3

ฉันต้องการสร้าง DataFrame จากสิ่งนี้:

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

สิ่งนี้สร้างข้อผิดพลาด:

ValueError: หากใช้ค่าสเกลาร์ทั้งหมดคุณต้องผ่านดัชนี

ฉันลองสิ่งนี้ด้วย:

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

สิ่งนี้ทำให้ข้อความแสดงข้อผิดพลาดเดียวกัน

คำตอบ:


571

ข้อความแสดงข้อผิดพลาดบอกว่าถ้าคุณผ่านค่าสเกลาร์คุณต้องผ่านดัชนี ดังนั้นคุณจึงไม่สามารถใช้ค่าสเกลาร์สำหรับคอลัมน์ได้เช่นใช้รายการ:

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

หรือใช้ค่าสเกลาร์และส่งผ่านดัชนี:

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

7
อาจเป็นเพราะลำดับของรายการในรายการใน Python นั้นคงอยู่ในขณะที่การเรียงลำดับของรายการในพจนานุกรมไม่ได้ คุณสามารถยกตัวอย่าง DataFrame ด้วยพจนานุกรมที่ว่างเปล่า ตามหลักการแล้วฉันคิดว่า DataFrame แบบแถวเดียวดังที่แสดงไว้ที่นี่จะสามารถสร้างจากพจนานุกรมได้เนื่องจากลำดับไม่สำคัญ อย่างไรก็ตามมีหลายแถว Pandas จะไม่สามารถสร้าง DataFrame ได้เนื่องจากจะไม่ทราบว่ารายการใดเป็นของแถวเดียวกัน
Alexander

2
@VitalyIsaev - ในกรณีนี้แถว dataframe (แสดงโดยพจนานุกรมที่กำหนด) ไม่มีดัชนี (ไม่แม้แต่โดยปริยาย) ทางออกที่ง่ายคือห่อพจนานุกรมภายในรายการซึ่งมี "การจัดทำดัชนีตามธรรมชาติ" หนึ่งสามารถอ้างได้ว่าถ้ามีเพียงหนึ่งพจนานุกรมที่ได้รับ (ไม่มีรายการการห่อ) จากนั้นถือว่าindex=0แต่อาจนำไปสู่การใช้ผิดโดยไม่ตั้งใจ (คิดว่าพจนานุกรมเดียวสามารถสร้าง dataframe หลายแถวอย่างใดอย่างหนึ่ง)
Ori

วิธีแก้ปัญหาต่าง ๆ ในลิงค์นี้eulertech.wordpress.com/2017/11/28/…
Jason Goal

เหตุผลนี้เป็นเพราะ DataFrames มีไว้เพื่อเก็บข้อมูลสองมิติ (เช่นแถวของตัวแปรสองตัวของ OP) หากคุณต้องการที่จะถือดัชนีคู่ -> คู่ค่า (เช่นพจนานุกรม) คุณควรใช้ซีรี่ส์ตามที่ร็อบแนะนำ
danuker

นี่เป็นตัวอย่างดาต้า / แถวเดียวดังนั้น index = [0] จึงสมเหตุสมผล แต่คุณสามารถปรับให้เป็น index = [100] ซึ่งใช้งานได้ ถาม: ดัชนีไม่ควรสั่งแบบมีเหตุผลเพิ่มขึ้นทำไมงูหลามจึงอนุญาตให้ทำการเปลี่ยนแปลงดัชนี
Sumanth Lazarus

65

นอกจากนี้คุณยังสามารถใช้pd.DataFrame.from_recordsซึ่งสะดวกกว่าเมื่อคุณมีพจนานุกรมอยู่แล้ว:

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

นอกจากนี้คุณยังสามารถตั้งค่าดัชนีถ้าคุณต้องการโดย:

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

27
คำตอบนี้ใช้ไม่ได้สำหรับฉัน - ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันเมื่อใช้ from_records
Dave Kielpinski

เดฟคุณลองใช้ชิ้นส่วนของรหัส (แน่นอนและ b แน่นอน)? คุณยังได้รับข้อความแสดงข้อผิดพลาดหรือไม่? คุณโพสต์ได้ไหม
fAX

12
@DaveKielpinski คุณอาจลืมใส่เครื่องหมายวงเล็บหรือไม่?
Dennis

นี่จะใช้คีย์ dict เป็นชื่อคอลัมน์ วิธีการตั้งค่าปุ่มเพื่อจัดทำดัชนี?
mingchau

@DaveKielpinski โปรดตรวจสอบว่าคุณผ่านรายการไปยังวิธีการ "from_records" หรือไม่ มิฉะนั้นจะไม่ทำงานและคุณจะได้รับข้อความแสดงข้อผิดพลาดเช่นเดียวกับเมื่อคุณโทร DataFrame ในพจนานุกรม
mairan

55

คุณต้องสร้างซีรีย์แพนด้าก่อน ขั้นตอนที่สองคือการแปลงซีรีส์แพนด้าเป็นดาต้าดาต้าแพนด้า

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

คุณสามารถระบุชื่อคอลัมน์ได้

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

1
สิ่งนี้ใช้ได้สำหรับฉัน พจนานุกรมของฉันมีคีย์จำนวนเต็มและค่า ndarray
StatsSorceress

pd.Series(data).to_frame('ColumnName')สั้นกว่านี้ถึงแม้ว่าจะเทียบเท่าโดยตรงกว่า:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
อเล็กซ์ F

29

คุณอาจลองห่อพจนานุกรมของคุณลงในรายการ

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

ซีรีย์อาจมีฟังก์ชั่นทั้งหมดที่คุณต้องการ:

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

DataFrame ถือได้ว่าเป็นชุดของซีรี่ส์ดังนั้นคุณสามารถ:

  • เชื่อมหลายซีรี่ส์เข้าด้วยกันในกรอบข้อมูลเดียว (ดังอธิบายไว้ที่นี่ )

  • เพิ่มตัวแปร Series ลงในกรอบข้อมูลที่มีอยู่ ( ตัวอย่างที่นี่ )


7

คุณต้องระบุ iterables เป็นค่าสำหรับคอลัมน์ Pandas DataFrame:

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

6

ฉันมีปัญหาเดียวกันกับอาร์เรย์ numpy และวิธีแก้ปัญหาคือทำให้แบน:

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

df = pd.DataFrame(data)

3

หากคุณต้องการแปลงพจนานุกรมสเกลาร์คุณต้องรวมดัชนี:

import pandas as pd

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

แม้ว่าดัชนีไม่จำเป็นสำหรับพจนานุกรมของรายการความคิดเดียวกันสามารถขยายไปยังพจนานุกรมของรายการ:

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)

แน่นอนสำหรับพจนานุกรมของรายการคุณสามารถสร้างดาต้าเฟรมได้โดยไม่ต้องมีดัชนี:

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

3

คุณสามารถลอง:

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

จากเอกสารเกี่ยวกับอาร์กิวเมนต์ 'orient': หากคีย์ของ dict ที่ส่งผ่านควรเป็นคอลัมน์ของ DataFrame ที่ได้รับผลลัพธ์ให้ส่ง 'column' (ค่าเริ่มต้น) มิฉะนั้นหากคีย์ควรเป็นแถวให้ผ่าน 'ดัชนี'


โปรดใช้เครื่องมือการจัดรูปแบบเพื่อแก้ไขและจัดรูปแบบคำถาม / คำตอบของคุณอย่างถูกต้อง รหัสภายในประโยคจะถูกจัดรูปแบบเป็นcode คำที่สำคัญมากที่จะเป็นตัวหนา , ตัวเอียงที่สำคัญน้อยกว่าตัวเอนและใช้รายการถ้าจำเป็น
Morse

สิ่งนี้ไม่ได้แก้คำถามที่ถามก็จะให้ผลลัพธ์ที่แตกต่างกว่าที่ต้องการ
Ken Williams

3

นุ่นวิเศษในที่ทำงาน ตรรกะทั้งหมดหมดแล้ว

ข้อความแสดงข้อผิดพลาด"ValueError: If using all scalar values, you must pass an index"บอกว่าคุณต้องผ่านดัชนี

นี่ไม่ได้แปลว่าการผ่านดัชนีทำให้แพนด้าทำในสิ่งที่คุณต้องการให้ทำ

เมื่อคุณผ่านดัชนีแพนด้าจะถือว่าคีย์พจนานุกรมของคุณเป็นชื่อคอลัมน์และค่าตามที่ควรมีคอลัมน์สำหรับค่าแต่ละค่าในดัชนี

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

    A   B
1   2   3

ผ่านดัชนีที่ใหญ่กว่า:

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

ดัชนีมักจะสร้างขึ้นโดยอัตโนมัติโดย dataframe เมื่อไม่ได้รับ แต่นุ่นไม่ทราบว่าแถวจำนวนเท่าใด2และ3คุณต้องการ อย่างไรก็ตามคุณสามารถมีความชัดเจนมากขึ้นเกี่ยวกับเรื่องนี้

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

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

แม้ว่าดัชนีเริ่มต้นจะขึ้นอยู่กับ 0

ฉันจะแนะนำให้ส่งพจนานุกรมของรายการไปยังตัวสร้างดาต้าเฟรมเสมอเมื่อสร้างดาต้าเฟรม ง่ายต่อการอ่านสำหรับนักพัฒนาคนอื่น Pandas มีข้อแม้มากมายอย่าทำให้นักพัฒนาคนอื่นต้องให้ผู้เชี่ยวชาญในพวกเขาทั้งหมดเพื่ออ่านโค้ดของคุณ


3

อินพุตไม่จำเป็นต้องเป็นรายการของบันทึก - สามารถเป็นพจนานุกรมเดียวได้เช่นกัน:

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

ซึ่งดูเหมือนจะเทียบเท่ากับ:

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

2

นี่เป็นเพราะ DataFrame มีสองมิติที่ใช้งานง่าย - คอลัมน์และแถว

คุณกำลังระบุคอลัมน์โดยใช้ปุ่มพจนานุกรมเท่านั้น

หากคุณต้องการระบุข้อมูลหนึ่งมิติให้ใช้ซีรี่ส์!


0

แปลงพจนานุกรมเป็น Data Frame

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

ตั้งชื่อใหม่ให้กับคอลัมน์

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

-2

หากคุณมีพจนานุกรมคุณสามารถเปลี่ยนมันเป็นกรอบข้อมูลแพนด้าด้วยบรรทัดของรหัสต่อไปนี้:

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

มันใช้งานได้ แต่ IMHO มันไม่สมเหตุสมผล <code> `<! - ภาษา: lang-py -> fruits_count = defaultdict (int) fruits_count [" แอปเปิ้ล "] = 10 fruit_count [" กล้วย "] = 21 pd.DataFrame ({"key": fruits_count.keys (), "value": fruits_count.values ​​()}) Out: ค่าคีย์ 0 (กล้วยแอปเปิ้ล) (21, 10) 1 (กล้วยแอปเปิ้ล) (21, 10) <code>
2560

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.