我有一个字典列表,响应字段内有光谱数据。我还有波长阵列用于标记光谱数据的列。列表/输入如下所示:
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]
我想将此列表转换为两个 pandas 数据框;
- 对响应元组中的数组进行平均,并且
- 它们是分开的,其中包含响应中元组中的第一个数字。
两者所需的输出如下:
__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 中执行此操作最有效的方法是什么?
最佳答案
这可能不是理想的解决方案,但使用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
关于python - 有效地将带有嵌入数组的字典列表转换为 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55175438/