在列表中的字典中添加新键,其值为索引

时间:2019-01-21 08:26:22

标签: python pandas

df.at[0, 'A'] = [{'score': 12, 'player': [{'name': 'Jacob', 'score': 2},
                                          {'name': 'Shane', 'score': 5}, ...]},
                 {'score': 33, 'player': [{'name': 'Cindy', 'score': 4}, ...]}, ...]

说我在上面的数据框中有列“ A”的n个字典的列表。我想添加一个名为“ game”的新键,该键是列表的索引。因此,如下所示。

df.at[0, 'A'] = [{'score': 12, 'player': [...], 'game': 0},
                 {'score': 33, 'player': [...], 'game': 1}, ...]

由于我必须对'player'做同样的事情,所以我不想使用for循环。
有没有办法做到这一点?


df.at[0, 'A'][0]['player'] = [{'name': 'Jacob', 'score': 2, 'number': 0},
                              {'name': 'Shane', 'score': 5, 'number': 1}, ...]}

例如,“玩家”将具有键“数字”,其值是内部列表的索引。


基本上,我不想使用任何嵌套的for循环来执行此操作,因为我收到的实际数据是实际上以这种荒谬形式出现的更大的NL数据的方式。

2 个答案:

答案 0 :(得分:2)

考虑到您的数据结构,Barmar可能会陷入for循环中,这是正确的(逐个循环没有问题)。这是两个可能的解决方法。

“解决方案”

您要记录的信息是多余的,因此您一开始可能不需要理会。

基本上,您要说的是gamenumber的值已经由每个元素在列表中的位置编码了。很有可能有一种方法可以得到您想要计算的任何最终结果,同时还可以忽略所有冗余信息。

更大的点

您正在尝试处理结构复杂的大量数据。您可能会限制使用所发布的即席结构可以合理处理的内容。这里有一些更好的方法:

  • 如果您可以找到一种扁平化数据的方法(或某种意义上说至少使其成为“矩形”),则可以将其纠缠为Numpy array。 Numpy在极快和易于使用之间达到了一个很好的甜蜜点。

  • 您可以将内部字典转换为数据框中的更多级,以创建具有关联的MultiIndex的分层数据框。有一个很好的SO线程,其中包含更多信息here

  • 虽然不一定是性能最高的选项,但使复杂结构的数据更易于理解的一种不错的方法是将该结构表示为user-defined objects的层次结构。过去,我发现这是发现数据中隐藏关系的非常有效的方式(尽管就像我说的那样,它可能很慢)。

答案 1 :(得分:1)

我不明白您不想使用for循环的原因。如果可以克服,那就是:

for i, d in enumerate(list_of_dicts):
    d['game'] = i