Xây dựng gấu trúc DataFrame từ các giá trị trong các biến mang lại cho Value ValueError: Nếu sử dụng tất cả các giá trị vô hướng, bạn phải vượt qua một chỉ mục


370

Đây có thể là một câu hỏi đơn giản, nhưng tôi không thể tìm ra cách để làm điều này. Hãy nói rằng tôi có hai biến như sau.

a = 2
b = 3

Tôi muốn xây dựng một DataFrame từ đây:

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

Điều này tạo ra một lỗi:

ValueError: Nếu sử dụng tất cả các giá trị vô hướng, bạn phải vượt qua một chỉ mục

Tôi cũng đã thử điều này:

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

Điều này đưa ra thông báo lỗi tương tự.

Câu trả lời:


571

Thông báo lỗi nói rằng nếu bạn truyền các giá trị vô hướng, bạn phải truyền một chỉ mục. Vì vậy, bạn không thể sử dụng các giá trị vô hướng cho các cột - ví dụ: sử dụng danh sách:

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

hoặc sử dụng các giá trị vô hướng và truyền một chỉ mục:

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

7
Có lẽ đó là do thứ tự của các mục trong danh sách trong Python không ổn định trong khi thứ tự các mục trong từ điển thì không. Bạn có thể khởi tạo DataFrame bằng một từ điển trống. Về nguyên tắc, tôi cho rằng DataFrame một hàng như được hiển thị ở đây cũng có thể được xây dựng từ một từ điển vì thứ tự không quan trọng (nhưng điều này đã không được thực hiện). Tuy nhiên, với nhiều hàng, Pandas sẽ không thể tạo DataFrame vì nó không biết mục nào thuộc về cùng một hàng.
Alexander

2
@VitalyIsaev - Trong trường hợp đó, hàng dataframe (được đại diện bởi từ điển đã cho) không có chỉ mục (thậm chí không phải là một ẩn). Một giải pháp đơn giản là bọc từ điển trong một danh sách, trong đó có "lập chỉ mục tự nhiên". Người ta có thể tuyên bố rằng nếu chỉ có một từ điển được đưa ra (không có danh sách gói), thì giả sử index=0, nhưng điều đó có thể dẫn đến việc lạm dụng ngẫu nhiên (nghĩ rằng một từ điển duy nhất có thể tạo ra một khung dữ liệu nhiều hàng)
Ori

Một số giải pháp trong liên kết này eulertech.wordpress.com/2017/11/11/ trên
Mục tiêu của Jason

Lý do cho điều này là do DataFrames có nghĩa là chứa dữ liệu hai chiều (tức là các hàng của hai biến OP). Nếu bạn chỉ muốn giữ chỉ mục -> cặp giá trị (như Từ điển), thì bạn nên sử dụng Sê-ri, như Rob gợi ý.
danuker

Đây là một Dataframe mẫu / hàng đơn, vì vậy index = [0] có ý nghĩa logic; nhưng bạn cũng có thể thao tác nó thành index = [100], hoạt động. H: Không phải Index được yêu cầu tăng thứ tự một cách hợp lý, tại sao python cho phép thao tác Index?
Sumanth Lazarus

65

Bạn cũng có thể sử dụng pd.DataFrame.from_recordstiện lợi hơn khi bạn đã có sẵn từ điển:

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

Bạn cũng có thể đặt chỉ mục, nếu bạn muốn, bằng cách:

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

27
Câu trả lời này không phù hợp với tôi - Tôi nhận được thông báo lỗi tương tự khi sử dụng from_records.
Dave Kielpinski

Dave, bạn đã thử đoạn mã (tất nhiên xác định a và b) chưa? Bạn vẫn nhận được thông báo lỗi? Bạn có thể đăng bài không?
Fax

12
@DaveKielpinski Bạn có thể quên thêm dấu ngoặc không?
Dennis

Điều này sẽ sử dụng các khóa dict làm tên cột. Làm thế nào để thiết lập các khóa để lập chỉ mục?
mingchau

@DaveKielpinski Vui lòng kiểm tra xem bạn đã chuyển danh sách cho phương thức "from_records" chưa; nếu không, nó sẽ không hoạt động và bạn sẽ nhận được thông báo lỗi giống như khi bạn gọi DataFrame trên từ điển.
mairan

55

Bạn cần tạo một loạt gấu trúc trước. Bước thứ hai là chuyển đổi chuỗi gấu trúc thành khung dữ liệu gấu trúc.

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

Bạn thậm chí có thể cung cấp một tên cột.

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

1
Điều này làm việc cho tôi. Từ điển của tôi có các khóa nguyên và giá trị ndarray.
Số liệu thống kê

pd.Series(data).to_frame('ColumnName')ngắn hơn, mặc dù tương đương này có lẽ trực tiếp hơn:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

Bạn có thể thử gói từ điển của bạn vào danh sách

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

Có lẽ Series sẽ cung cấp tất cả các chức năng bạn cần:

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

DataFrame có thể được coi là một bộ sưu tập Sê-ri do đó bạn có thể:

  • Ghép nhiều Sê-ri vào một khung dữ liệu (như được mô tả ở đây )

  • Thêm một biến Series vào khung dữ liệu hiện có ( ví dụ ở đây )


7

Bạn cần cung cấp các lần lặp làm giá trị cho các cột Pandas DataFrame:

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

6

Tôi đã có cùng một vấn đề với mảng numpy và giải pháp là làm phẳng chúng:

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

df = pd.DataFrame(data)

3

Nếu bạn có ý định chuyển đổi một từ điển vô hướng, bạn phải bao gồm một chỉ mục:

import pandas as pd

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

Mặc dù không cần chỉ mục cho một từ điển danh sách, nhưng ý tưởng tương tự có thể được mở rộng thành từ điển danh sách:

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)

Tất nhiên, đối với từ điển danh sách, bạn có thể xây dựng khung dữ liệu mà không cần chỉ mục:

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

3

Bạn có thể thử:

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

Từ tài liệu về đối số 'direction': Nếu các khóa của chính tả đã qua phải là các cột của DataFrame kết quả, hãy chuyển 'cột' (mặc định). Mặt khác, nếu các khóa phải là hàng, hãy vượt qua 'index'.


Vui lòng sử dụng các công cụ định dạng để chỉnh sửa và định dạng đúng câu hỏi / câu trả lời của bạn. Các mã trong câu phải được định dạng là các từ code Rất quan trọng cần in đậm , các lực lượng ít quan trọng hơn Chữ nghiêng cũng sử dụng danh sách nếu cần
Morse

Điều này không giải quyết được câu hỏi, nó tạo ra một kết quả khác với mong muốn.
Ken Williams

3

Gấu trúc ma thuật trong công việc. Tất cả logic là ra.

Thông báo lỗi Cho "ValueError: If using all scalar values, you must pass an index"biết bạn phải vượt qua một chỉ mục.

Điều này không nhất thiết có nghĩa là vượt qua một chỉ số khiến gấu trúc làm những gì bạn muốn nó làm

Khi bạn vượt qua một chỉ mục, gấu trúc sẽ coi các khóa từ điển của bạn là tên cột và các giá trị như những gì cột cần chứa cho mỗi giá trị trong chỉ mục.

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

    A   B
1   2   3

Vượt qua một chỉ số lớn hơn:

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

Một chỉ mục thường được tự động tạo bởi một khung dữ liệu khi không được đưa ra. Tuy nhiên, gấu trúc không biết có bao nhiêu hàng 23bạn muốn. Tuy nhiên, bạn có thể rõ ràng hơn về nó

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

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

Chỉ số mặc định là 0 mặc dù.

Tôi khuyên bạn nên luôn luôn chuyển từ điển danh sách cho hàm tạo khung dữ liệu khi tạo các tệp dữ liệu. Nó dễ đọc hơn cho các nhà phát triển khác. Pandas có rất nhiều cảnh báo, đừng bắt các nhà phát triển khác phải tìm đến các chuyên gia trong tất cả chúng để đọc mã của bạn.


3

đầu vào không phải là một danh sách các bản ghi - nó cũng có thể là một từ điển duy nhất:

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

Có vẻ như tương đương với:

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

2

Điều này là do DataFrame có hai thứ nguyên trực quan - các cột các hàng.

Bạn chỉ xác định các cột bằng các phím từ điển.

Nếu bạn chỉ muốn chỉ định dữ liệu một chiều, hãy sử dụng Sê-ri!


0

Chuyển đổi từ điển sang khung dữ liệu

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

Đặt tên mới cho Cột

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

-2

Nếu bạn có một từ điển, bạn có thể biến nó thành một khung dữ liệu gấu trúc với dòng mã sau:

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

Nó hoạt động, nhưng IMHO nó không có ý nghĩa nhiều <code> `<! - ngôn ngữ: lang-py -> fruit_count = defaultdict (int) fruit_count [" apples "] = 10 fruit_count [" chuối "] = 21 pd.DataFrame ({"key": fruit_count.keys (), "value": fruit_count.values ​​()}) Out: key value 0 (chuối, táo) (21, 10) 1 (chuối, táo) (21, 10) <code>
Emiter

-3

Chỉ cần vượt qua dict trong danh sách:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.