Chuyển đổi lệnh Python thành một khung dữ liệu


299

Tôi có một từ điển Python như sau:

{u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

Các khóa là ngày Unicode và các giá trị là số nguyên. Tôi muốn chuyển đổi nó thành một khung dữ liệu gấu trúc bằng cách có ngày và giá trị tương ứng của chúng dưới dạng hai cột riêng biệt. Ví dụ: col1: Dates col2: DateValue (ngày vẫn là Unicode và datevalues ​​vẫn là số nguyên)

     Date         DateValue
0    2012-07-01    391
1    2012-07-02    392
2    2012-07-03    392
.    2012-07-04    392
.    ...           ...
.    ...           ...

Bất kỳ trợ giúp theo hướng này sẽ được nhiều đánh giá cao. Tôi không thể tìm thấy tài nguyên trên các tài liệu về gấu trúc để giúp tôi điều này.

Tôi biết một giải pháp có thể là chuyển đổi từng cặp khóa-giá trị trong dict này, thành một dict để toàn bộ cấu trúc trở thành một dict của dicts, và sau đó chúng ta có thể thêm từng hàng vào khung dữ liệu. Nhưng tôi muốn biết liệu có cách nào dễ dàng hơn và cách trực tiếp hơn để làm việc này không.

Cho đến nay tôi đã cố gắng chuyển đổi dict thành một đối tượng loạt nhưng điều này dường như không duy trì mối quan hệ giữa các cột:

s  = Series(my_dict,index=my_dict.keys())

Tôi đã thử chuyển đổi dict thành một đối tượng chuỗi với ngày là chỉ mục nhưng điều đó không khớp với ngày với các giá trị tương ứng vì một số lý do.
anonuser0428

mã đã được đăng. Tôi muốn hỏi liệu có cách nào để tạo một khung dữ liệu mà không tạo ra một lệnh chính tả và sau đó thêm từng hàng riêng biệt.
anonuser0428

1
"Ngày Unicode" là gì? Bạn có nghĩa là một ngày ISO 8601 ?
Peter Mortensen

Câu trả lời:


461

Lỗi ở đây, là do gọi hàm tạo DataFrame bằng các giá trị vô hướng (trong đó nó dự kiến ​​các giá trị là một danh sách / dict / ... tức là có nhiều cột):

pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index

Bạn có thể lấy các mục từ từ điển (nghĩa là các cặp khóa-giá trị):

In [11]: pd.DataFrame(d.items())  # or list(d.items()) in python 3
Out[11]:
             0    1
0   2012-07-02  392
1   2012-07-06  392
2   2012-06-29  391
3   2012-06-28  391
...

In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue'])
Out[12]:
          Date  DateValue
0   2012-07-02        392
1   2012-07-06        392
2   2012-06-29        391

Nhưng tôi nghĩ sẽ hợp lý hơn khi vượt qua hàm tạo Series:

In [21]: s = pd.Series(d, name='DateValue')
Out[21]:
2012-06-08    388
2012-06-09    388
2012-06-10    388

In [22]: s.index.name = 'Date'

In [23]: s.reset_index()
Out[23]:
          Date  DateValue
0   2012-06-08        388
1   2012-06-09        388
2   2012-06-10        388

4
@ user1009091 Tôi nhận ra lỗi này có nghĩa là gì, về cơ bản nó nói "Cái tôi đang thấy là một Series, vì vậy hãy sử dụng hàm tạo Series".
Andy Hayden

1
Cảm ơn - rất hữu ích. Có lẽ bạn có thể giải thích sự khác biệt giữa việc sử dụng phương thức này và sử dụng DataFrame.from_dict ()? Phương thức của bạn (mà tôi đã sử dụng) trả về type = pandas.core.frame.DataFrame, trong khi phương thức khác trả về type = class 'pandas.core.frame.DataFrame'. Bất kỳ cơ hội nào bạn có thể giải thích sự khác biệt và khi mỗi phương pháp là phù hợp? Cảm ơn trước :)
Optimesh

cả hai đều tương tự nhau, from_dictcó một kwarg định hướng, vì vậy tôi có thể sử dụng nó nếu tôi muốn tránh chuyển vị. Có một vài tùy chọn với from_dict, bên dưới mui xe, nó không thực sự khác biệt so với sử dụng hàm tạo DataFrame.
Andy Hayden

54
Tôi đang nhìn thấy pandas.core.common.PandasError: DataFrame constructor not properly called!từ ví dụ đầu tiên
allthesignals

18
@allthesignals thêm danh sách () xung quanh d.items hoạt động: pd.DataFrame (danh sách (d.items ()), cột = ['Ngày', 'DateValue'])
sigurdb

141

Khi chuyển đổi một từ điển thành một khung dữ liệu gấu trúc nơi bạn muốn các khóa là các cột của khung dữ liệu đã nói và các giá trị là các giá trị hàng, bạn có thể chỉ cần đặt dấu ngoặc quanh từ điển như sau:

>>> dict_ = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'}
>>> pd.DataFrame([dict_])

    key 1     key 2     key 3
0   value 1   value 2   value 3

Nó đã cứu tôi một số vấn đề đau đầu vì vậy tôi hy vọng nó sẽ giúp được ai đó ngoài kia!

EDIT: Trong các tài liệu gấu trúc, một tùy chọn cho datatham số trong hàm tạo DataFrame là một danh sách các từ điển. Ở đây chúng tôi đang chuyển một danh sách với một từ điển trong đó.


6
Có tôi cũng đã làm điều này nhưng đã thêm .T để hoán vị.
Anton BBR

1
Nó hoạt động tốt nhưng không biết tại sao chúng ta phải làm như thế này.
hui chen

Điều gì xảy ra nếu tôi muốn một cột này được sử dụng làm chỉ mục
om tripathi

102

Như đã giải thích về một câu trả lời khác sử dụng pandas.DataFrame()trực tiếp ở đây sẽ không hoạt động như bạn nghĩ.

Những gì bạn có thể làm là sử dụng pandas.DataFrame.from_dictvới orient='index':

In[7]: pandas.DataFrame.from_dict({u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 .....
 u'2012-07-05': 392,
 u'2012-07-06': 392}, orient='index', columns=['foo'])
Out[7]: 
            foo
2012-06-08  388
2012-06-09  388
2012-06-10  388
2012-06-11  389
2012-06-12  389
........
2012-07-05  392
2012-07-06  392

1
chúng ta có thể xâu chuỗi này với bất kỳ renamephương thức nào để đặt tên của chỉ mục các cột trong một lần không?
Ciprian Tomoiagă

4
điểm tốt. Một ví dụ sẽ là: ...., direction = 'index'). Đổi tên (cột = {0: 'foobar'})
ntg

1
Bạn cũng có thể chỉ định pandas.DataFrame.from_dict (..., direction = 'index', Cột = ['foo', 'bar']), đây là từ nguồn được liệt kê ở trên .
spen.smith

điểm tốt, điều này đúng từ gấu trúc .22, sau câu trả lời ban đầu ... Đã cập nhật câu trả lời của tôi ...
ntg

69

Chuyển các mục của từ điển cho hàm tạo DataFrame và đặt tên cột. Sau đó phân tích Datecột để lấy Timestampgiá trị.

Lưu ý sự khác biệt giữa python 2.x và 3.x:

Trong trăn 2.x:

df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

Trong Python 3.x: (yêu cầu một 'danh sách' bổ sung)

df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

3
Điều này mang lại cho tôi:PandasError: DataFrame constructor not properly called!
Chris Nielsen

18
@ChrisNielsen Có lẽ bạn đang sử dụng python3. Bạn nên thử:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
Viktor Kerkez

Đây là câu trả lời tốt hơn vì nó cho thấy những gì phải được thực hiện trong Python 3.
ifly6


10

Gấu trúc có chức năng tích hợp để chuyển đổi dict sang khung dữ liệu.

pd.DataFrame.from_dict (dictionaryObject, direction = 'index')

Đối với dữ liệu của bạn, bạn có thể chuyển đổi nó như dưới đây:

import pandas as pd
your_dict={u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

your_df_from_dict=pd.DataFrame.from_dict(your_dict,orient='index')
print(your_df_from_dict)

2
Đó là giải pháp thực sự tồi tệ, vì lưu các khóa từ điển dưới dạng chỉ mục.
Một nhà kinh tế

6
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })

5

Bạn cũng có thể chuyển các khóa và giá trị của từ điển vào khung dữ liệu mới, như vậy:

import pandas as pd

myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()

5

Trong trường hợp của tôi, tôi muốn các khóa và giá trị của một dict là các cột và giá trị của DataFrame. Vì vậy, điều duy nhất làm việc cho tôi là:

data = {'adjust_power': 'y', 'af_policy_r_submix_prio_adjust': '[null]', 'af_rf_info': '[null]', 'bat_ac': '3500', 'bat_capacity': '75'} 

columns = list(data.keys())
values = list(data.values())
arr_len = len(values)

pd.DataFrame(np.array(values, dtype=object).reshape(1, arr_len), columns=columns)

5

Đây là những gì làm việc cho tôi, vì tôi muốn có một cột chỉ mục riêng

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']

3

Chấp nhận một dict làm đối số và trả về một khung dữ liệu với các khóa của dict là chỉ mục và các giá trị dưới dạng cột.

def dict_to_df(d):
    df=pd.DataFrame(d.items())
    df.set_index(0, inplace=True)
    return df

ra lệnh, trả về khung dữ liệu
trước hết là

3

Đây là cách nó làm việc cho tôi:

df= pd.DataFrame([d.keys(), d.values()]).T
df.columns= ['keys', 'values']  # call them whatever you like

Tôi hi vọng cái này giúp được


1
d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())}
df = pandas.DataFrame(data=d)

Nếu bạn không gói gọn yourDict.keys()bên trong list(), thì bạn sẽ kết thúc với tất cả các khóa và giá trị của bạn được đặt ở mỗi hàng của mỗi cột. Như thế này:

Date \ 0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

Nhưng bằng cách thêm vào list()thì kết quả trông như thế này:

Date Date_Values 0 2012-06-08 388 1 2012-06-09 388 2 2012-06-10 388 3 2012-06-11 389 4 2012-06-12 389 ...


0

Tôi đã chạy vào đây nhiều lần và có một từ điển mẫu mà tôi đã tạo từ một hàm get_max_Path()và nó trả về từ điển mẫu:

{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}

Để chuyển đổi nó thành một khung dữ liệu, tôi đã chạy như sau:

df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()

Trả về một khung dữ liệu hai cột đơn giản với một chỉ mục riêng:

index 0 0 2 0.309750 1 3 0.441318

Chỉ cần đổi tên các cột bằng f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


0

Tôi nghĩ rằng bạn có thể thực hiện một số thay đổi trong định dạng dữ liệu của mình khi tạo từ điển, sau đó bạn có thể dễ dàng chuyển đổi nó thành DataFrame:

đầu vào:

a={'Dates':['2012-06-08','2012-06-10'],'Date_value':[388,389]}

đầu ra:

{'Date_value': [388, 389], 'Dates': ['2012-06-08', '2012-06-10']}

đầu vào:

aframe=DataFrame(a)

đầu ra: sẽ là DataFrame của bạn

Bạn chỉ cần sử dụng một số chỉnh sửa văn bản ở một nơi nào đó như Sublime hoặc có thể là Excel.

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.