แปลง Pict dict เป็น dataframe


299

ฉันมีพจนานุกรม Python ดังนี้:

{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}

กุญแจคือวันที่Unicodeและค่าเป็นจำนวนเต็ม ฉันต้องการแปลงให้เป็น dataframe แพนด้าโดยมีวันที่และค่าที่เกี่ยวข้องเป็นสองคอลัมน์แยก ตัวอย่าง: col1: วันที่ col2: DateValue (วันที่ยังคงเป็น Unicode และวันที่ยังคงเป็นจำนวนเต็ม)

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

ความช่วยเหลือในทิศทางนี้จะได้รับการชื่นชมมาก ฉันไม่สามารถค้นหาแหล่งข้อมูลบนเอกสารของหมีแพนด้าเพื่อช่วยฉันได้

ฉันรู้ว่าวิธีแก้ปัญหาหนึ่งอาจจะแปลงคู่คีย์ - ค่าใน dict นี้เป็น dict เพื่อให้โครงสร้างทั้งหมดกลายเป็น dict ของ dicts และจากนั้นเราสามารถเพิ่มแต่ละแถวลงใน dataframe แต่ฉันต้องการทราบว่ามีวิธีที่ง่ายกว่าและเป็นวิธีที่ตรงกว่านี้หรือไม่

จนถึงตอนนี้ฉันได้ลองแปลง dict เป็นวัตถุอนุกรม แต่ดูเหมือนจะไม่รักษาความสัมพันธ์ระหว่างคอลัมน์:

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

ฉันได้ลองแปลง dict เป็นวัตถุอนุกรมที่มีวันที่เป็นดัชนี แต่ไม่ตรงกับวันที่ด้วยค่าที่เกี่ยวข้องด้วยเหตุผลบางอย่าง
anonuser0428

รหัสได้รับการโพสต์ ฉันต้องการสอบถามว่ามีวิธีสร้าง dataframe หรือไม่โดยสร้าง dict-of-dicts แล้วเพิ่มแต่ละแถวแยกกัน
anonuser0428

1
"Unicode date" คืออะไร? คุณหมายถึงวันที่ISO 8601หรือไม่
Peter Mortensen

คำตอบ:


461

ข้อผิดพลาดที่นี่เนื่องจากเรียกตัวสร้าง DataFrame ด้วยค่าสเกลาร์ (ซึ่งคาดว่าค่าจะเป็น list / dict / ... เช่นมีหลายคอลัมน์):

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

คุณสามารถนำรายการจากพจนานุกรม (เช่นคู่ของคีย์ - ค่า):

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

แต่ฉันคิดว่ามันสมเหตุสมผลกว่าที่จะผ่านตัวสร้างซีรี่ส์:

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 ฉันรู้ว่าข้อผิดพลาดหมายถึงอะไรตอนนี้มันพูดว่า "สิ่งที่ฉันเห็นคือซีรี่ส์ดังนั้นใช้ตัวสร้างซีรี่ส์"
Andy Hayden

1
ขอบคุณ - มีประโยชน์มาก คุณอาจอธิบายได้ว่าอะไรคือความแตกต่างระหว่างการใช้วิธีนี้กับการใช้ DataFrame.from_dict () วิธีการของคุณ (ที่ฉันใช้) ส่งคืน type = pandas.core.frame.DataFrame ขณะที่อีกประเภทหนึ่งคือ type = class 'pandas.core.frame.DataFrame' โอกาสใดที่คุณสามารถอธิบายความแตกต่างและเมื่อแต่ละวิธีมีความเหมาะสม? ขอบคุณล่วงหน้า :)
Optimesh

ทั้งคู่มีความคล้ายคลึงกันfrom_dictมี kwarg ตะวันออกดังนั้นฉันอาจใช้มันหากฉันต้องการหลีกเลี่ยงการโยกย้าย มีตัวเลือกน้อยด้วยfrom_dictภายใต้ประทุนมันไม่แตกต่างจากการใช้ตัวสร้าง DataFrame
Andy Hayden

54
ฉันเห็นpandas.core.common.PandasError: DataFrame constructor not properly called!จากตัวอย่างแรก
allthesignals

18
@allthesignals เพิ่มรายการ () รอบงาน d.items: pd.DataFrame (รายการ (d.items ()), คอลัมน์ = ['วันที่', 'DateValue'])
sigurdb

141

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

>>> 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

มันช่วยฉันปวดหัวดังนั้นฉันหวังว่ามันจะช่วยให้ใครบางคนอยู่ที่นั่น!

แก้ไข: ในpandas docsหนึ่งตัวเลือกสำหรับdataพารามิเตอร์ในตัวสร้าง DataFrame คือรายการพจนานุกรม ที่นี่เรากำลังส่งรายการโดยมีหนึ่งพจนานุกรมอยู่ในนั้น


6
ใช่ฉันทำเช่นนี้ แต่เพิ่ม. T เพื่อโอนย้าย
Anton vBR

1
มันใช้งานได้ดี แต่ไม่รู้ว่าทำไมเราต้องทำเช่นนี้
ฮุ่ยเฉิน

จะทำอย่างไรถ้าฉันต้องการให้คอลัมน์เหล่านี้ใช้เป็นดัชนี
om tripathi

102

ตามที่อธิบายไว้ในคำตอบอื่นโดยใช้ pandas.DataFrame()โดยตรงที่นี่จะไม่ทำตามที่คุณคิด

สิ่งที่คุณสามารถทำได้คือใช้pandas.DataFrame.from_dictกับ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
เราสามารถเชื่อมโยงสิ่งนี้ด้วยrenameวิธีใด ๆเพื่อตั้งชื่อของดัชนีและคอลัมน์ในครั้งเดียวได้หรือไม่?
Ciprian Tomoiagă

4
จุดดี. ตัวอย่างหนึ่ง ได้แก่ : .... , orient = 'index') เปลี่ยนชื่อ (column = {0: 'foobar'})
ntg

1
นอกจากนี้คุณยังสามารถระบุ pandas.DataFrame.from_dict ( 'ดัชนี' ... , Orient = คอลัมน์ = [ 'foo', 'บาร์']) นี้มาจากแหล่งที่ระบุไว้ข้างต้น
spen.smith

จุดดีนี่เป็นความจริงจาก pandas .22 ซึ่งเป็นคำตอบเดิมหลังจาก ... อัปเดตคำตอบของฉัน ...
ntg

69

ส่งรายการของพจนานุกรมไปยังตัวสร้าง DataFrame และตั้งชื่อคอลัมน์ หลังจากนั้นแยกDateคอลัมน์เพื่อรับTimestampค่า

สังเกตเห็นความแตกต่างระหว่างไพ ธ อน 2.x และ 3.x:

ใน python 2.x:

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

ใน Python 3.x: (ต้องการ 'รายการ' เพิ่มเติม)

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

3
นี่ทำให้ฉัน:PandasError: DataFrame constructor not properly called!
Chris Nielsen

18
@ChrisNielsen คุณอาจใช้ python3 คุณควรลอง:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
Viktor Kerkez

นี่เป็นคำตอบที่ดีกว่าเพราะมันแสดงให้เห็นว่าต้องทำอะไรใน Python 3
ifly6


10

Pandas มีฟังก์ชั่นในตัวสำหรับการแปลง dict เป็น data frame

pd.DataFrame.from_dict (dictionaryObject, Orient = 'ดัชนี')

สำหรับข้อมูลของคุณคุณสามารถแปลงได้ดังนี้:

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
นั่นเป็นวิธีที่ไม่ดีจริงๆเนื่องจากจะบันทึกคีย์พจนานุกรมเป็นดัชนี
นักเศรษฐศาสตร์


5

คุณสามารถส่งคีย์และค่าของพจนานุกรมไปยังดาต้าเฟรมใหม่ได้เช่น:

import pandas as pd

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

5

ในกรณีของฉันฉันต้องการคีย์และค่าของ dict เป็นคอลัมน์และค่าของ DataFrame ดังนั้นสิ่งเดียวที่ทำงานให้ฉันคือ:

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

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันเนื่องจากฉันต้องการแยกคอลัมน์ดัชนี

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

3

ยอมรับ dict เป็นอาร์กิวเมนต์และส่งคืน dataframe พร้อมกับคีย์ของ dict เป็นดรรชนีและค่าเป็นคอลัมน์

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

ใช้ Dict ให้ผลตอบแทนที่กรอบข้อมูล
แรก

3

นี่คือวิธีการทำงานสำหรับฉัน:

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

ฉันหวังว่านี่จะช่วยได้


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

ถ้าคุณไม่แค็ปซูลyourDict.keys()ภายในlist()แล้วคุณจะจบลงด้วยทั้งหมดของคีย์และค่าของคุณจะถูกวางอยู่ในแถวของคอลัมน์ทุก แบบนี้:

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...

แต่เมื่อเพิ่มlist()แล้วผลลัพธ์จะมีลักษณะดังนี้:

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

ฉันพบเจอหลายครั้งและมีพจนานุกรมตัวอย่างที่ฉันสร้างขึ้นจากฟังก์ชั่นget_max_Path()และมันจะส่งกลับตัวอย่างพจนานุกรม:

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

ในการแปลงไฟล์นี้เป็น DataFrame ฉันได้ดำเนินการดังนี้:

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

ส่งคืน dataframe สองคอลัมน์แบบง่ายพร้อมดัชนีแยก:

index 0 0 2 0.309750 1 3 0.441318

เพียงเปลี่ยนชื่อคอลัมน์โดยใช้ f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


0

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

การป้อนข้อมูล:

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

เอาท์พุท:

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

การป้อนข้อมูล:

aframe=DataFrame(a)

เอาต์พุต: จะเป็น DataFrame ของคุณ

คุณเพียงแค่ต้องใช้การแก้ไขข้อความในที่อื่นเช่น Sublime หรือ Excel

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