python - 以数组为值的字典
问题描述
毕竟不确定这是否是一个好主意,但是有一个以数组作为值的字典,例如
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 似乎太慢了。
任何提示都是最受欢迎的!
解决方案
更简单一点,使用条件切片可以编写
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
原则上我会说numpy
在dict
. 您将拥有很大的灵活性,有时如果您直接执行操作会更有效numpy
(您甚至可以numba
用于纯数字、昂贵的计算) - 但如果不需要,并且您基本上可以使用 *m 表, pandas
dfs 又好又方便。
如果您的数据集很大并且您想要执行如图所示的许多查找,您可能不想在字符串上执行这些查找。为了提高性能,您可以为示例中的每个“进程”或“创建者”提供唯一的 ID(整数)。您只需要能够将它们映射回原始字符串,因此也要保留该数据。
推荐阅读
- c# - 使用 Entity Framework Core 迁移更新表以添加 Auto_Increment
- python - 如何从表格中获取所有 tr 元素并单击链接?
- angular - 在 FormArray 中添加嵌套的 Reactive FormArray - Angular 6
- python - 如何有效地找到numpy矩阵中一行最左边的非空值的索引列?
- logging - Google Scripts 神秘的执行时间和记录器行为
- ios - iOS/Objective-C:从 sharedInstance 调用 AlertViewController
- dom - Vue/Vuex/GSAP-Animation:添加 DOM 元素进行存储
- react-native - 在 IOS 和 Android 上使用 Flutter/React Native 播放 DRM 内容
- python - 如何从文本文件中写入和读取变量
- react-native - 无法读取未定义的属性“openPicker”