【问题标题】:Structured data, dictionaries inside lists结构化数据,列表中的字典
【发布时间】:2018-08-10 00:47:54
【问题描述】:

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

我试图在不使用 pandas 的情况下进行复制,我尝试使用 zip 和 pop,但我无法达到与使用 pandas df 所获得的相似的任何内容。

即使使用 pandas df pivot,输出也是我想要的,但我失去了“名称”,我希望为所有名称结构化数据。

我的问题是我可以在不使用 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

【问题讨论】:

  • 您希望表格中的行如何排序,其标题应该是什么?
  • 我看到的一件事:在rec 中的数据结构中,数据框将只有约翰的数据。
  • @Bill Bell,用假装的输出编辑我的问题。标题应该是日期、晚餐和午餐。并且表的名称应该是名称(即约翰)。
  • 你想用这四个字典列表做什么?他们应该在自己的列表中吗?或者可以将它们附加到一个列表中?
  • 我的目标是在没有熊猫的情况下以简单的方式重现我使用熊猫数据框获得的表格。 @柯克布罗德赫斯特。

标签: python python-2.7 list pandas dictionary


【解决方案1】:

这在 3 个条件下有效:

  1. 将您的输入变成字典列表。
  2. 删除重复项或指定合适的聚合函数。
  3. 将字符串fieldvalue 列转换为数字。

解决方案

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}

【讨论】:

  • 使用熊猫你的答案是有效的,但还有任何其他选项可以提供类似的输出但不是作为字典。我正在尝试使用 sqlite3 来做到这一点,但我的目标是尽可能简单地做到这一点。我尝试使用 DictWriter 以表格方式输出数据,但是将值赋予 fieldName 正在成为一项艰巨的任务。
  • 我这样做的方法是,如果可行,将字典中的每个数据帧输出到单独的 Excel 工作表。这很容易通过pandas 完成。否则,为什么不直接在列中添加名称而不是作为标题而忘记拆分成单独的数据框?
猜你喜欢
  • 2021-11-10
  • 2020-07-06
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2021-03-25
  • 2013-10-21
  • 2013-12-10
  • 2011-04-13
相关资源
最近更新 更多