结构化数据,列表中的字典

时间:2018-03-01 20:40:56

标签: python python-2.7 list pandas dictionary

我正在尝试将我的数据(带有字典的列表)结构化,为此我使用了pandas df。

我试图在没有使用熊猫的情况下进行复制,我尝试使用zip和pop,但是我无法达到与使用pandas df相似的任何东西。

即使使用pandas df pivot,输出也是我想要的,但我正在丢失'name',我希望为所有名称构建数据。

我的问题是我是否可以在不使用pandas的情况下获得类似的输出,以及为什么不为所有名称打印表格?

rec =[{'date': u'2018-01-21', 'name' : u'John', 'fieldname': u'lunch', 'fieldvalue': u'10'},
 {'date': u'2018-01-21', 'name' : u'John', 'fieldname': u'dinner', 'fieldvalue': u'9'},
 {'date': u'2018-01-22', 'name' : u'John', 'fieldname': u'lunch', 'fieldvalue': u'11'},
 {'date': u'2018-01-22', 'name' : u'John', 'fieldname': u'dinner', 'fieldvalue': u'8'},
 {'date': u'2018-01-23', 'name' : u'John', 'fieldname': u'lunch', 'fieldvalue': u'12'},
 {'date': u'2018-01-23', 'name' : u'John', 'fieldname': u'dinner', 'fieldvalue': u'5'}]
[{'date': u'2018-01-21', 'name' : u'Anna', 'fieldname': u'lunch', 'fieldvalue': u'11'},
 {'date': u'2018-01-21', 'name' : u'Anna', 'fieldname': u'dinner', 'fieldvalue': u'8'},
 {'date': u'2018-01-22', 'name' : u'Anna', 'fieldname': u'lunch', 'fieldvalue': u'13'},
 {'date': u'2018-01-22', 'name' : u'Anna', 'fieldname': u'dinner', 'fieldvalue': u'9'},
 {'date': u'2018-01-23', 'name' : u'Anna', 'fieldname': u'lunch', 'fieldvalue': u'11'},
 {'date': u'2018-01-23', 'name' : u'Anna', 'fieldname': u'dinner', 'fieldvalue': u'15'}]
[{'date': u'2018-01-21', 'name' : u'John', 'fieldname': u'lunch', 'fieldvalue': u'14'},
 {'date': u'2018-01-21', 'name' : u'John', 'fieldname': u'dinner', 'fieldvalue': u'3'},
 {'date': u'2018-01-22', 'name' : u'John', 'fieldname': u'lunch', 'fieldvalue': u'16'},
 {'date': u'2018-01-22', 'name' : u'John', 'fieldname': u'dinner', 'fieldvalue': u'9'},
 {'date': u'2018-01-23', 'name' : u'John', 'fieldname': u'lunch', 'fieldvalue': u'12'},
 {'date': u'2018-01-23', 'name' : u'John', 'fieldname': u'dinner', 'fieldvalue': u'9'}]
[{'date': u'2018-01-21', 'name' : u'Brian', 'fieldname': u'lunch', 'fieldvalue': u'11'},
 {'date': u'2018-01-21', 'name' : u'Brian', 'fieldname': u'dinner', 'fieldvalue': u'13'},
 {'date': u'2018-01-22', 'name' : u'Brian', 'fieldname': u'lunch', 'fieldvalue': u'12'},
 {'date': u'2018-01-22', 'name' : u'Brian', 'fieldname': u'dinner', 'fieldvalue': u'8'},
 {'date': u'2018-01-23', 'name' : u'Brian', 'fieldname': u'lunch', 'fieldvalue': u'11'},
 {'date': u'2018-01-23', 'name' : u'Brian', 'fieldname': u'dinner', 'fieldvalue': u'15'}]

df(rec)

         date fieldname fieldvalue  name
0  2018-01-21     lunch         10  John
1  2018-01-21    dinner          9  John
2  2018-01-22     lunch         11  John
3  2018-01-22    dinner          8  John
4  2018-01-23     lunch         12  John
5  2018-01-23    dinner          5  John

df(rec).pivot(index='date', columns='fieldname', values='fieldvalue')

fieldname  dinner lunch
date                   
2018-01-21      9    10
2018-01-22      8    11
2018-01-23      5    12

所需输出:

Anna
fieldname  dinner lunch
date                   
2018-01-21      9    10
2018-01-22      8    11
2018-01-23      5    12

John
fieldname  dinner lunch
date                   
2018-01-21      9    10
2018-01-22      8    11
2018-01-23      5    12

Brian
fieldname  dinner lunch
date                     
2018-01-21      9    10
2018-01-22      8    11
2018-01-23      5    12

1 个答案:

答案 0 :(得分:0)

这适用于3种情况:

  1. 将您的输入转换为词典列表。
  2. 删除重复项或指定合适的聚合函数。
  3. 将字符串fieldvalue列转换为数字。
  4. <强>解决方案

    df = pd.DataFrame(rec).drop_duplicates(['date', 'name', 'fieldname'])
    df['fieldvalue'] = pd.to_numeric(df['fieldvalue'], downcast='integer')
    
    dfs = {k: pd.pivot_table(df[df['name'] == k], index=['date'],
              columns=['fieldname'], values=['fieldvalue']) \
              for k in set(df['name'])}
    

    <强>结果

    由于我使用了上面的drop_duplicates选项,您可能会看到与所需输出不同的结果。

    {'Brian':            fieldvalue      
    fieldname      dinner lunch
    date                       
    2018-01-21         13    11
    2018-01-22          8    12
    2018-01-23         15    11,
    
     'Anna':            fieldvalue      
    fieldname      dinner lunch
    date                       
    2018-01-21          8    11
    2018-01-22          9    13
    2018-01-23         15    11,
    
     'John':            fieldvalue      
    fieldname      dinner lunch
    date                       
    2018-01-21          9    10
    2018-01-22          8    11
    2018-01-23          5    12}