我有一个这样的词典列表:
[{'points': 50, 'time': '5:00', 'year': 2010}, 
{'points': 25, 'time': '6:00', 'month': "february"}, 
{'points':90, 'time': '9:00', 'month': 'january'}, 
{'points_h1':20, 'month': 'june'}]我想把它变成这样的 pandas DataFrame :
month  points  points_h1  time  year
0       NaN      50        NaN  5:00  2010
1  february      25        NaN  6:00   NaN
2   january      90        NaN  9:00   NaN
3      june     NaN         20   NaN   NaN注意:列的顺序无关紧要。
如何将字典列表转换为如上所述的 pandas DataFrame?
假设d是您的字典列表,只需:
df = pd.DataFrame(d)注意:这不适用于嵌套数据。
如何将字典列表转换为 Pandas DataFrame?
其他答案是正确的,但是就这些方法的优点和局限性而言,并没有太多解释。这篇文章的目的是展示在不同情况下这些方法的示例,讨论何时使用(何时不使用),并提出替代方案。
DataFrame() , DataFrame.from_records()和.from_dict()根据数据的结构和格式,在某些情况下,这三种方法要么全部起作用,要么某些方法比其他方法更好,或者有些根本不起作用。
考虑一个非常人为的例子。
np.random.seed(0)
data = pd.DataFrame(
    np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')
print(data)
[{'A': 5, 'B': 0, 'C': 3, 'D': 3},
 {'A': 7, 'B': 9, 'C': 3, 'D': 5},
 {'A': 2, 'B': 4, 'C': 7, 'D': 6}]该列表由 “记录” 组成,其中包含每个键。这是您可能遇到的最简单的情况。
# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)
   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6orient='index' / 'columns'在继续之前,重要的是要区分不同类型的字典方向和熊猫的支持。有两种主要类型:“列” 和 “索引”。
 orient='columns'
方向为 “列” 的字典的键将与等效 DataFrame 中的列相对应。
例如, data以 “列” 方向显示。
data_c = [
 {'A': 5, 'B': 0, 'C': 3, 'D': 3},
 {'A': 7, 'B': 9, 'C': 3, 'D': 5},
 {'A': 2, 'B': 4, 'C': 7, 'D': 6}]pd.DataFrame.from_dict(data_c, orient='columns')
   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6注意:如果使用的是pd.DataFrame.from_records ,则假定方向为 “列”(否则无法指定),并且将相应地加载字典。
 orient='index'
以此方向,键被假定为对应于索引值。这种数据最适合pd.DataFrame.from_dict 。
data_i ={
 0: {'A': 5, 'B': 0, 'C': 3, 'D': 3},
 1: {'A': 7, 'B': 9, 'C': 3, 'D': 5},
 2: {'A': 2, 'B': 4, 'C': 7, 'D': 6}}pd.DataFrame.from_dict(data_i, orient='index')
   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6在 OP 中不考虑这种情况,但仍然有用。
如果需要在结果 DataFrame 上使用自定义索引,则可以使用index=...参数进行设置。
pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])
   A  B  C  D
a  5  0  3  3
b  7  9  3  5
c  2  4  7  6pd.DataFrame.from_dict不支持此功能。
当处理缺少键 / 列值的字典时,所有方法都是开箱即用的。例如,
data2 = [
     {'A': 5, 'C': 3, 'D': 3},
     {'A': 7, 'B': 9, 'F': 5},
     {'B': 4, 'C': 7, 'E': 6}]# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)
     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN“如果我不想在每一列中阅读该怎么办”? columns=...参数轻松地指定它。
例如,从data2示例字典中,如果您只想读取列 “A”,“D” 和 “F”,则可以通过传递一个列表来做到这一点:
pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])
     A    D    F
0  5.0  3.0  NaN
1  7.0  NaN  5.0
2  NaN  NaN  NaN具有默认方向 “列” 的pd.DataFrame.from_dict不支持此功能。
pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])ValueError: cannot use columns parameter with orient='columns'这些方法都不直接支持。您将必须遍历数据,并在进行迭代时就地执行反向删除。例如,只提取第0 和从第二行data2以上,可以使用:
rows_to_select = {0, 2}
for i in reversed(range(len(data2))):
    if i not in rows_to_select:
        del data2[i]
pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)
     A    B  C    D    E
0  5.0  NaN  3  3.0  NaN
1  NaN  4.0  7  NaN  6.0json_normalize上面概述的方法的一种强大而强大的替代方法是json_normalize函数,该函数可用于词典列表(记录),此外还可以处理嵌套词典。
pd.json_normalize(data)
   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6pd.json_normalize(data2)
     A    B  C    D    E
0  5.0  NaN  3  3.0  NaN
1  NaN  4.0  7  NaN  6.0同样,请记住,传递给json_normalize的数据必须采用字典列表(记录)格式。
如前所述, json_normalize也可以处理嵌套字典。这是从文档中获取的示例。
data_nested = [
  {'counties': [{'name': 'Dade', 'population': 12345},
                {'name': 'Broward', 'population': 40000},
                {'name': 'Palm Beach', 'population': 60000}],
   'info': {'governor': 'Rick Scott'},
   'shortname': 'FL',
   'state': 'Florida'},
  {'counties': [{'name': 'Summit', 'population': 1234},
                {'name': 'Cuyahoga', 'population': 1337}],
   'info': {'governor': 'John Kasich'},
   'shortname': 'OH',
   'state': 'Ohio'}
]pd.json_normalize(data_nested, 
                          record_path='counties', 
                          meta=['state', 'shortname', ['info', 'governor']])
         name  population    state shortname info.governor
0        Dade       12345  Florida        FL    Rick Scott
1     Broward       40000  Florida        FL    Rick Scott
2  Palm Beach       60000  Florida        FL    Rick Scott
3      Summit        1234     Ohio        OH   John Kasich
4    Cuyahoga        1337     Ohio        OH   John Kasichmeta和record_path参数的更多信息,请查阅文档。
这是上面讨论的所有方法的表格,以及受支持的功能部件 / 功能。
 * 使用orient='columns'然后转置以获得与orient='index'相同的效果。
在熊猫 16.2 中,我必须执行pd.DataFrame.from_records(d)才能使其正常工作。