我有一个包含不同长度的值列表的字典。我需要能够一起处理每个列表中特定索引(列)的所有值。我发现的唯一方法是将其转换为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 本身花费的时间最多。一旦我有了数据框,我就可以对它进行矢量化,但在此之前,我被卡住了。
使用 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