【问题标题】:Python Dictionary keys with nested list to pandas DataFrame带有嵌套列表的Python字典键到pandas DataFrame
【发布时间】:2018-09-26 13:29:23
【问题描述】:

我有一本字典如下:

D = {
    'd1': [[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]], 
    'd2': [[b1, b1, b1], [b2, b2, b2], [b3, b3, b3]], 
    'd3': [[c1, c1, c1], [c2, c2, c2], [c3, c3, c3]], 
    'd4': [[d1, d1, d1], [d2, d2, d2], [d3, d3, d3]]
}

如何将其转换为数据框,以便

  • 键列表中的列是配对的;嵌套列表分别是时间值、温度和损坏值,数据框需要将它们放在单独的列中。 S代表[[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]],你会得到一行a1, a2, a3(第一列),然后是第二列的一行,等等。

  • 数据帧行通过组合键与下一个键进行分组,d1d2 组合为 6 行(3 行来自 d1,3 行来自 d2),然后组合 d2使用d3 再生成 6 行,依此类推。因此,对于每个 3 行的 4 个键,您会得到 6 行 == 18 行的 3 种组合。

我尝试在连接之前转换为数据框:

new_df = pd.DataFrame(list(D.values()), columns=['Time_sec', 'Temperature', 'Damage'])

但我仍然坚持连接部分。

预期输出示例:

【问题讨论】:

  • 那些a1a2等引用实际上是浮点数吗?
  • 您能否编辑帖子以添加您期望的输出示例?
  • 你能给我们一个预期输出的小样本吗?
  • @MartijnPieters 是的,它们是浮点数
  • 刚刚看到那个链接

标签: python python-3.x pandas dictionary concatenation


【解决方案1】:

您想将给定键的每个子列表zip() 组合在一起,以组合每个子列表中的值形成新行:

>>> list(zip(*D['d1']))
[('a1', 'a2', 'a3'), ('a1', 'a2', 'a3'), ('a1', 'a2', 'a3')]

然后将其应用于字典中的每个值以生成扁平的行序列,您可以在其中选择配对。

我假设您想在这里将dNdN+1 配对,而不管键的数量如何。请注意,字典实际上是 无序的(尽管 Python 3.6 及更高版本的插入顺序被保留),因此您可能需要先应用一些排序:

sorted_keys = sorted(D)

之后我们可以将它们与zip(sorted_keys, sorted_keys[1:])配对:

>>> sorted_keys = sorted(D)
>>> list(zip(sorted_keys, sorted_keys[1:]))
[('d1', 'd2'), ('d2', 'd3'), ('d3', 'd4')]

使用此序列将行配对并展平生成的键序列,然后是压缩行:

sorted_keys = sorted(D)
paired = (k for keys in zip(sorted_keys, sorted_keys[1:]) for k in keys)
df = pd.DataFrame(
    (row for k in paired for row in zip(*D[k])), 
    columns=['Time_sec', 'Temperature', 'Damage']
)

这会产生:

   Time_sec Temperature Damage
0        a1          a2     a3
1        a1          a2     a3
2        a1          a2     a3
3        b1          b2     b3
4        b1          b2     b3
5        b1          b2     b3
6        b1          b2     b3
7        b1          b2     b3
8        b1          b2     b3
9        c1          c2     c3
10       c1          c2     c3
11       c1          c2     c3
12       c1          c2     c3
13       c1          c2     c3
14       c1          c2     c3
15       d1          d2     d3
16       d1          d2     d3
17       d1          d2     d3

【讨论】:

  • 感谢您的建议,但首先要附加字典键,然后再转换为数据帧。您的输出和我的预期输出之间存在差异,因为您可以看到我的“b”和“c”值在输出中重复
  • @RaziurRahman:那么您的问题完全不清楚。我的答案中的输出与您的屏幕截图有何不同?
  • 键顺序应该是d1 d2 d2 d3 d3 d4
  • @RaziurRahman:这还不清楚根本。键重复的规则是什么?
  • @RaziurRahman:那是您希望d1 + d2 成为第一组行,然后是d2 + d3 等的部分吗?如果有 10 个键呢?还是只有 1 个?
【解决方案2】:

使用枚举

l = ['Time', 'Temperature', 'Damage']
d2 = {}

for idx, item in enumerate(l):
    for k, v in d.items():
        if item not in d2:
            d2[item] = v[idx]
        else:
            d2[item] += v[idx]
{'Time': ['a1, a1, a1', 'b1, b1, b1', 'c1, c1, c1', 'd1, d1, d1'],
'Temperature': ['a2, a2, a2', 'b2, b2, b2', 'c2, c2, c2', 'd2, d2,
d2'], 'Damage': ['a3, a3, a3', 'b3, b3, b3', 'c3, c3, c3', 'd3, d3,
d3']}

使用伪值

a1, a2, a3  = 0, 'a', '!'
b1, b2, b3  = 0, 'a', '!'
c1, c2, c3  = 0, 'a', '!'
d1, d2, d3  = 0, 'a', '!'
{'Time': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Temperature': ['a',
'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'], 'Damage':
['!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!']}

【讨论】:

  • No.. 请看预期的输出
  • 这个怎么样?
  • 我必须将你的变量设为字符串,但你可以在没有字符串的情况下这样做
  • @RaziurRahman 我看到你不想要一个未删除的,如果这样不合适会删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2017-12-26
  • 2020-02-18
  • 2019-06-27
  • 2018-05-30
  • 2016-07-24
  • 2022-01-01
相关资源
最近更新 更多