首页 > 解决方案 > 以数组为值的字典

问题描述

毕竟不确定这是否是一个好主意,但是有一个以数组作为值的字典,例如

DF = {'z_eu': array([127.45064758, 150.4478288 , 150.74781189, -98.3227338 , -98.25155681, -98.24993753]), 
      'Process': array(['initStep', 'Transportation', 'Transportation', 'Transportation', 'Transportation', 'phot']),
      'Creator': array(['SynRad', 'SynRad', 'SynRad', 'SynRad', 'SynRad', 'SynRad']) }

我需要z_eu根据其他两个键的值来选择数字数据 ( )。

到目前为止,我想出的一种解决方法是提取数组并遍历它们,从而创建另一个包含有效数据的数组。

proc = DF['Process']; z= DF['z_eu']; creat = DF['Creator']
data = [z for z,p,c in zip(z, proc,creat) if (p == 'initStep') and c=='SynRad' ]

但不知何故,这在我看来是可以通过更智能地处理字典来完全避免的努力?此外,这也zip()需要很长时间。

我知道数据框是一个有效的替代方案,但不幸的是,由于我正在处理字符串,pandas 似乎太慢了。

任何提示都是最受欢迎的!

标签: pythonnumpydictionary

解决方案


更简单一点,使用条件切片可以编写

data = DF['z_eu'][(DF['Process'] == 'initStep') & (DF['Creator'] == 'SynRad')]

...或仍在使用zip,您可以简化为

data = [z for z, p, c in zip(*DF.values()) if p == 'initStep' and c == 'SynRad']

基本上也是条件切片,使用pandas DataFrame

df = pd.DataFrame(DF)
data = df.loc[(df['Process'] == 'initStep') & (df['Creator'] == 'SynRad'), 'z_eu']
print(data)
# 0    127.450648
# Name: z_eu, dtype: float64

原则上我会说numpydict. 您将拥有很大的灵活性,有时如果您直接执行操作会更有效numpy(您甚至可以numba用于纯数字、昂贵的计算) - 但如果不需要,并且您基本上可以使用 *m 表, pandasdfs 又好又方便。

如果您的数据集很大并且您想要执行如图所示的许多查找,您可能不想在字符串上执行这些查找。为了提高性能,您可以为示例中的每个“进程”或“创建者”提供唯一的 ID(整数)。您只需要能够将它们映射回原始字符串,因此也要保留该数据。


推荐阅读