当前位置: 首页 > 知识库问答 >
问题:

将词典列表转换为熊猫数据帧

后安民
2023-03-14

我有一个这样的字典列表:

[{'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'}]

我想把它变成一个熊猫数据帧,如下所示:

      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

注意:列的顺序并不重要。

如何将字典列表转换为如上所示的数据帧?

共有3个答案

竺翰海
2023-03-14
匿名用户

在pandas 16.2中,我必须从_records(d)中执行pd.DataFrame。

齐铭
2023-03-14

其他答案是正确的,但没有太多解释这些方法的优点和局限性。这篇文章的目的是展示不同情况下这些方法的例子,讨论何时使用(何时不使用),并提出替代方案。

根据数据的结构和格式,在某些情况下,这三种方法要么都有效,要么有些比其他方法更好,要么根本不起作用。

考虑一个非常巧妙的例子。

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  6

在继续之前,重要的是要区分不同类型的字典方向,并支持熊猫。有两种主要类型:“列”和“索引”。

orient='columns'
具有“columns”方向的词典将使其键对应于等效数据帧中的列。

例如,上面的数据处于“列”方向。

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'
使用此方向,假定键对应于索引值。这类数据最适合于来自_dict的pd.DataFrame。

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中未考虑此情况,但了解此情况仍然很有用。

如果需要在结果数据帧上设置自定义索引,可以使用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  6

pd不支持这一点。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

“如果我不想在每一栏都读呢”?您可以使用列=...参数轻松指定此项。

例如,从上面的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

默认方向为“列”的dict的pd.DataFrame.from不支持这一点。

pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'

这些方法都不直接支持。您必须迭代数据,并在迭代时就地执行反向删除。例如,要仅从上面的data2中提取0th和2nd行,可以使用:

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

上述方法的一个强大、健壮的替代方法是json\u normalize函数,它可以处理字典(记录)列表,此外还可以处理嵌套字典。

pd.json_normalize(data)

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6
pd.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\u normalize的数据需要采用字典列表(记录)格式。

如前所述,json\u 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 Kasich

有关记录路径参数的更多信息,请查看文档。

下面是上面讨论的所有方法的列表,以及支持的特性/功能。

*使用orient='columns',然后转置以获得与orient='index'相同的效果

况弘新
2023-03-14

假设d是您的任务列表,简单地说:

df = pd.DataFrame(d)

注意:这不适用于嵌套数据。

 类似资料:
  • 我有一本这样的字典: 我只是想把它转换成一个数据帧,其中的列是,等等,然后将索引设置为当前日期和小时,我将使用该代码作为。 生成的如下所示: 我的第一步是将dict转换为数据帧,就我而言,这段代码应该可以做到这一点: 但是我得到这个错误消息:。 我真的不知道这里有什么问题?任何建议都是很好的,如果有人能够解决将指数调整为bargin的问题,那就更好了。干杯

  • 我对熊猫有些陌生。我有一个熊猫数据框,是一行23列。 我想把它转换成一个系列?我想知道做这件事最像蟒蛇的方式是什么? 我试过pd。系列(我的结果),但它抱怨。它还没有聪明到意识到它仍然是数学术语中的“向量”。 谢谢!

  • 我想读取ArcGIS形状文件的文件,并将其转储到数据帧中。我目前正在使用dbf包。 显然,我已经能够将文件作为一个表加载,但还不能理解如何解析它并将其转换为一个数据帧。怎么做? 这就是我所处的困境: Python将此语句作为输出返回,坦率地说,我不知道该如何处理: 编辑 我的原始示例:

  • 我有一本python词典,名为,由关键字和值组成,这些关键字和值表示它们在给定文本中出现的频率: 现在,我需要将其制作成一个包含两列的pandas数据框:一列名为“word”,表示单词,另一列名为“count”,表示频率。

  • 问题内容: 我对熊猫有些陌生。我有一个熊猫数据框,它是1行乘23列。 我想将其转换为系列吗?我想知道最pythonic的方法是什么? 我试过了,但是抱怨。它不够聪明,无法意识到它仍然是数学上的“向量”。 谢谢! 问题答案: 它不够聪明,无法意识到它仍然是数学上的“向量”。 可以说它足够聪明,可以识别尺寸差异。:-) 我认为您可以做的最简单的事情是使用位置选择该行,这将为您提供一个Series,其列

  • 我面临的一个基本问题是如何用json格式的文本来转换从解析列中获得的字典列表。以下是数据的简短快照: 此外,我用来解析的代码详细如下: stdf_noncookie是我试图转换成熊猫数据目录的字典列表。'attributes'是具有json格式文本的列。我试图从这个链接中学到一些东西,但这并不能解决我的问题。任何将词典列表转换为panda dataframe的建议/技巧都将有所帮助。