【问题标题】:Convert list of dicts of dict into DataFrame将dict的dict列表转换为DataFrame
【发布时间】:2018-10-14 02:57:45
【问题描述】:

我有一个字典列表,如下所示:

[{'a': 1, 'b': {'c': 1, 'd': 2, 'e': 3}, 'f': 4}, 
 {'a': 2, 'b': {'c': 2, 'd': 3, 'e': 4}, 'f': 3}, 
 {'a': 3, 'b': {'c': 3, 'd': 4, 'e': 5}, 'f': 2}, 
 {'a': 4, 'b': {'c': 4, 'd': 5, 'e': 6}, 'f': 1 }]

结果应该是这样的:

     a    c    d    e    f
0    1    1    2    3    4
1    2    2    3    4    3
2    3    3    4    5    2
3    4    4    5    6    1

虽然默认的 pd.DataFrame(data) 看起来像:

     a    b                           f
0    1    {'c': 1, 'd': 2, 'e': 3}    4
1    2    {'c': 2, 'd': 3, 'e': 4}    3
2    3    {'c': 3, 'd': 4, 'e': 5}    2
3    4    {'c': 4, 'd': 5, 'e': 6}    1

我怎样才能用熊猫做到这一点?谢谢。

【问题讨论】:

  • {'a': 1, 'b': {'c': 1, 'd': 2, 'e': 3}, 'f': 4}转换成{'a': 1, 'c': 1, 'd': 2, 'e': 3, 'f': 4}再加载到Pandas,可以先试试
  • @VikashSingh 我会说不,这不是重复的,因为这里我们从与 json 文件并置的 python 字典开始。
  • 好吧,我确实看到了一些不同,所以我决定写一个不同的答案。感谢您指出:)

标签: python pandas dataframe


【解决方案1】:

您需要将 json 转换为平面数据:

import pandas as pd
from pandas.io.json import json_normalize
data = [{'a': 1, 'b': {'c': 1, 'd': 2, 'e': 3}, 'f': 4}, 
        {'a': 2, 'b': {'c': 2, 'd': 3, 'e': 4}, 'f': 3}, 
        {'a': 3, 'b': {'c': 3, 'd': 4, 'e': 5}, 'f': 2}, 
        {'a': 4, 'b': {'c': 4, 'd': 5, 'e': 6}, 'f': 1 }]

df = pd.DataFrame.from_dict(json_normalize(data), orient='columns')
df

# output:
    a   b.c b.d b.e f
0   1   1   2   3   4
1   2   2   3   4   3
2   3   3   4   5   2
3   4   4   5   6   1

完成后,您可以重命名列..

【讨论】:

  • json_normalize 很棒,但确实需要减少隐藏。
  • 很高兴你喜欢它@AaronN.Brock 它真的很有用:) 实际上很多功能都非常隐藏,如果不是这样,我们会非常非常迷茫..
  • 就个人而言,我认为这个功能需要更多的关注,例如你应该能够直接从.json 文件中读取,而不是必须将 json 文件加载到字典中然后将其传递给这个函数.
  • 此外,应该有将其读入series 等的选项。它确实应该是pd.read_json() 函数的一部分。我解决这个问题的方法是通过pandas.io.json.normalize.nested_to_record 函数,这真的很糟糕
【解决方案2】:

json_normalize 就是你要找的东西!

import pandas as pd
from pandas.io.json import json_normalize

x = [{'a': 1, 'b': {'c': 1, 'd': 2, 'e': 3}, 'f': 4}, 
 {'a': 2, 'b': {'c': 2, 'd': 3, 'e': 4}, 'f': 3}, 
 {'a': 3, 'b': {'c': 3, 'd': 4, 'e': 5}, 'f': 2}, 
 {'a': 4, 'b': {'c': 4, 'd': 5, 'e': 6}, 'f': 1 }]

sep = '::::' # string that doesn't appear in column names

frame = json_normalize(x, sep=sep)
frame.columns = frame.columns.str.split(sep).str[-1]
print(frame)

输出

   a  c  d  e  f
0  1  1  2  3  4
1  2  2  3  4  3
2  3  3  4  5  2
3  4  4  5  6  1

【讨论】:

  • json_normalize 派上用场。谢谢!
【解决方案3】:
import pandas as pd
z=[{'a': 1, 'b': {'c': 1, 'd': 2, 'e': 3}, 'f': 4}, 
 {'a': 2, 'b': {'c': 2, 'd': 3, 'e': 4}, 'f': 3}, 
 {'a': 3, 'b': {'c': 3, 'd': 4, 'e': 5}, 'f': 2}, 
 {'a': 4, 'b': {'c': 4, 'd': 5, 'e': 6}, 'f': 1 }]
step1=pd.DataFrame(z)
column_with_sets = 'b'
step2=pd.DataFrame(list(step1[column_with_sets]))
step3=pd.concat([step1[[i for i in step1.columns if column_with_sets 
not in i]], step2],1)
step4=output.reindex_axis(sorted(output.columns), axis=1)

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2017-01-28
    • 2017-02-21
    • 2013-12-28
    • 2017-03-03
    • 2020-10-23
    • 2021-07-16
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多