【问题标题】:Efficiently converting a list of dictionaries with embedded arrays to DataFrame有效地将具有嵌入式数组的字典列表转换为 DataFrame
【发布时间】:2019-08-06 02:39:02
【问题描述】:

我有一个字典列表,其中包含响应字段中的光谱数据。我还有用于标记光谱数据列的波长阵列。列表/输入如下所示:

data = [  {
    'date': '2018-01-01',
    'measurement': 100,
    'responses': [(1, 1, np.array([1, 2, 3])),
                (2, 1, np.array([4, 5, 6])),
               ]
   },
   {
    'date': '2018-01-02',
    'measurement': 200,
    'responses': [(3, 1,np.array([5, 6, 7])),
                (4, 1, np.array([8, 9, 10])),
               ]
   },
]

以及要匹配的波长的列名:

wavelengths = [400,401,402]

我想将此列表转换为两个熊猫数据框;

  1. 平均响应元组中的数组,并且
  2. 它们是分开的,其中包含响应中元组中的第一个到数字。

两者的期望输出如下:

__Average Dataframe__
index | date           | measurement | 400   | 401   | 402   |
0     | '2018-01-01'   | 100         | 2.5   | 3.5   | 4.5   |
1     | '2018-01-02'   | 200         | 6.5   | 7.5   | 8.5   |


__Seperate Dataframe__
index | date           | measurement | prong | scan| 400 | 401 | 402 |
0     | '2018-01-01'   | 100         | 1     | 1   | 1   | 2   | 3   |
1     | '2018-01-01'   | 100         | 2     | 1   | 4   | 5   | 6   |
2     | '2018-01-02'   | 200         | 3     | 1   | 5   | 6   | 7   |
3     | '2018-01-02'   | 200         | 4     | 1   | 8   | 9   | 10  |

在 pandas 中最有效的方法是什么?

【问题讨论】:

  • 请提供一些可重现的输入和预期的输出。
  • 嗨,克里斯,你希望这个格式如何?
  • 对于初学者,您可以提供一个有效的dict。它只是一种格式,不是正确的dict。并且由于拥有 1100 个浮点数或 3 个浮点数需要类似的功能,因此您可以为更精确的示例提供更短的 responses 伪值,也许更短的一个。通过Minimal, Complete and Verifiable example 可以帮助您提出更好的问题:)
  • @Chris 谢谢克里斯,我已经更新了问题,希望这更具可读性!

标签: python pandas dataframe optimization spectral


【解决方案1】:

这可能不是理想的解决方案,但使用pandas

import pandas as pd

wavelengths= [400, 401,402]
cols = ['prong', 'scan'] + wavelengths 

df1 = pd.concat([pd.DataFrame(dict([(k, pd.Series(v)) for k, v in d.items()])) for d in data])
df1 = df1.reset_index(drop=True).ffill()
df2 = pd.DataFrame([(x,y,*z) for x,y,z in df1['responses']], columns= cols)

df = pd.concat([df1.drop('responses', 1), df2], 1)
# Separate dataset
         date  measurement  prong  scan  400  401  402
0  2018-01-01        100.0      1     1    1    2    3
1  2018-01-01        100.0      2     1    4    5    6
2  2018-01-02        200.0      3     1    5    6    7
3  2018-01-02        200.0      4     1    8    9   10

df.groupby(['date', 'measurement'])[wavelengths].mean().reset_index()
# Average dataset
         date  measurement  400  401  402
0  2018-01-01        100.0  2.5  3.5  4.5
1  2018-01-02        200.0  6.5  7.5  8.5

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2018-07-25
    • 2021-03-03
    相关资源
    最近更新 更多