高效读取pandas数据框中的数据并获取一定范围内的平均值

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

我正在从一些文本文件中读取大量数据并将其保存到数据帧中,以便稍后在稍后处理数据时能够轻松访问这些列。我觉得我目前的做法效率非常低,希望获得更好的帮助。文本文件是模拟的每个时间步骤的不同变量的值。模拟按类别分组,我想要每个类别的平均值。我不想取输出的每个变量的平均值,而只想取我选择的变量的平均值。

数据的一些基础知识。 文件的数量是已知的。 我想要平均的数据帧数量是已知的(来自某个类别的所有文件)。 所有文件中的列始终相同,因此数据帧也相同。类别的数量和名称是已知的。

下面是我目前正在做的一些简化的半伪代码。请注意,原始数据中有更多文件和列。

sim_nr = np.arange(1,13)
categories = ['a','b','c']
variables = ['S', 'P', 'L']
multi_column = pd.MultiIndex.from_tuples(list(zip(categories, sim_nr)))

all_data = {}
for i in number_of_files:
    data = pd.read_csv('data_'+str(i)+'.txt')
    all_data[mutlicolumn[i]] = data

#for working example use this dictionary, 
all_data = {('a',1): pd.DataFrame({'S':[1,2,3,4], 'Q':[1,2,3,4], 'P':[78,5,3,6], 'M':[1,2,3,4], 'L':[23,5,61,85]}),
            ('a',2): pd.DataFrame({'S':[1,2,3,4], 'Q':[1,2,3,4], 'P':[78,5,3,6], 'M':[1,2,3,4], 'L':[32,73,30,41]}), 
            ('b',3):pd.DataFrame({'S':[1,2,3,4], 'Q':[1,2,3,4], 'P':[2,3,4,5], 'M':[1,2,3,4], 'L':[32,73,30,41]}),
            ('b',4):pd.DataFrame({'S':[1,2,3,4], 'Q':[1,2,3,4], 'P':[78,5,3,6], 'M':[1,2,3,4], 'L':[32,73,30,41]}),
            ('c',5):pd.DataFrame({'S':[1,2,3,4], 'Q':[1,2,3,4], 'P':[11,20,55,8], 'M':[1,2,3,4], 'L':[23,5,61,85]}),
            ('c',6):pd.DataFrame({'S':[1,2,3,4], 'Q':[1,2,3,4], 'P':[78,5,3,6], 'M':[1,2,3,4], 'L':[32,73,30,41]})}

variableS = pd.DataFrame()
variableP = pd.DataFrame()
variableL = pd.DataFrame()

for cat in categories:
    test = pd.DataFrame()
    for key, data in all_data.items():
        if key[0] == cat:
            # print(key[0])
            test= pd.concat([test, data[variables]], axis= 1)
    variableS[cat] = test['S'].mean(axis=1)
    variableP[cat] = test['P'].mean(axis=1)
    variableL[cat] = test['L'].mean(axis=1)
        

我希望获得有关如何改进这一点的帮助。特别是最后一个循环如何保存不同变量的平均值。

pandas dataframe average
1个回答
0
投票

您可以使用

groupby
stack
/
unstack
:

tmp = (pd.concat(all_data)[['S', 'P', 'L']]
         .groupby(level=[0, 2]).mean()
         .stack().unstack(0)
       )

out = {k: v.droplevel(1) for k,v in tmp.groupby(level=1)}
© www.soinside.com 2019 - 2024. All rights reserved.