在python中处理长度不等的数组列表的最有效方法。

问题描述 投票:0回答:1

我有一个包含不同长度的值列表的字典。我需要能够一起处理每个列表中特定索引(列)的所有值。我发现的唯一方法是将其转换为pandas数据框架。然而,这对于实际的数据集来说是非常慢的,因为数据集可能包括1000多个事件(行),每个事件有数百个观测值(列)。

一个简化的例子是这样的。

event_dict= {}
event_dict['event1'] = [1,2,3,4,5]
event_dict['event2'] = [1,3,5,4,7,8,9,8]
event_dict['event3'] = [1,3,2,4]
event_dict['event4'] = [1, -1, 1, 2, 2,5]
#actual dictionary can have thousand+ rows with 100+ entries per row

event_df = pd.DataFrame()
for key in event_dict:
    temp_df = pd.DataFrame(event_dict[key])
    event_df = event_df.append(temp_df, ignore_index = True)

print(values_df)
values_df.mean()

输出将是这样的:

   0  1  2  3    4    5    6    7
0  1  2  3  4  5.0  NaN  NaN  NaN
1  1  3  5  4  7.0  8.0  9.0  8.0
2  1  3  2  4  NaN  NaN  NaN  NaN
3  1 -1  1  2  2.0  5.0  NaN  NaN

0    1.000000
1    1.750000
2    2.750000
3    3.500000
4    4.666667
5    6.500000
6    9.000000
7    8.000000

由于每个列表都包含不同数量的值 我很难找出一个不使用数据帧的有效实现方法。考虑到需要的迭代次数等因素,实际的代码在创建 values_df 本身花费的时间最多。一旦我有了数据框,我就可以对它进行矢量化,但在此之前,我被卡住了。

python pandas dataframe
1个回答
4
投票

使用 DataFrame.from_dict 和参数 orient='index':

s = pd.DataFrame.from_dict(event_dict, orient='index').mean()
print (s)
0    1.000000
1    1.750000
2    2.750000
3    3.500000
4    4.666667
5    6.500000
6    9.000000
7    8.000000
dtype: float64

另一个想法是使用 zip_longest 与填补不同长度的缺失值。

from  itertools import zip_longest

a = np.nanmean(np.array(list(zip_longest(*list(event_dict.values()), fillvalue=np.nan))), 
               axis=1)
print (a)
[1.         1.75       2.75       3.5        4.66666667 6.5
 9.         8.        ]

s = pd.Series(a)
print (s)
0    1.000000
1    1.750000
2    2.750000
3    3.500000
4    4.666667
5    6.500000
6    9.000000
7    8.000000
dtype: float64
© www.soinside.com 2019 - 2024. All rights reserved.