我正在从一些文本文件中读取大量数据并将其保存到数据帧中,以便稍后在稍后处理数据时能够轻松访问这些列。我觉得我目前的做法效率非常低,希望获得更好的帮助。文本文件是模拟的每个时间步骤的不同变量的值。模拟按类别分组,我想要每个类别的平均值。我不想取输出的每个变量的平均值,而只想取我选择的变量的平均值。
数据的一些基础知识。 文件的数量是已知的。 我想要平均的数据帧数量是已知的(来自某个类别的所有文件)。 所有文件中的列始终相同,因此数据帧也相同。类别的数量和名称是已知的。
下面是我目前正在做的一些简化的半伪代码。请注意,原始数据中有更多文件和列。
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)
我希望获得有关如何改进这一点的帮助。特别是最后一个循环如何保存不同变量的平均值。
您可以使用
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)}