以数组作为值的字典

2024-09-30 18:24:34 发布

您现在位置: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似乎太慢了。你知道吗

欢迎任何提示!你知道吗


Tags: 数据df字典数组procziparrayprocess
2条回答

您可以循环一个数组,并通过索引获得正确的元素

z_eu = DF['z_eu']
process = DF['Process']
creator = DF['Creator']

result = []
for i in range(len(z_eu)):
    if process[i] == 'initStep' and creator[i] == 'SynRad':
        result.append(z_eu[i])
print(result)

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

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']

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

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

原则上,我认为在dict中处理numpy数组没有什么问题。如果直接在numpy中进行运算,您会有很大的灵活性,有时运算效率会更高(您甚至可以利用numba进行纯数值的、昂贵的计算)-但是如果不需要这样做,并且您基本上可以使用n*m表,pandasdfs非常好而且方便。你知道吗

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

相关问题 更多 >