【问题标题】:Python: df.mean seems to give the wrong output, why?Python:df.mean 似乎给出了错误的输出,为什么?
【发布时间】:2017-09-21 06:20:10
【问题描述】:

背景: 我正忙于分析各种实验工作的数据。目的是导入带有各种工作表的 excel 文件。然后从数据中“过滤”噪声并找到所有样本的平均值。然后绘制图表并保存图表。

进展与问题: 我已经能够完成上述所有步骤,但是,各种样本与其平均值的最终图表对我来说似乎是错误的。我不确定“df.mean”是否是找到平均值的正确方法。我附上了我得到的图表,不知何故我不能同意平均值可以这么低? It can be seen that the saved image from my code cuts off the legend, how can I change this?

需要改进: 这是我关于 stackoverflow 的第一个问题,我对 Python 还是很陌生。代码看起来很“蓬松”,如果有任何关于缩短代码的建议,我将不胜感激。

我的密码:

#IMPORT LIBRARIES
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#IMPORT DATA 
excel_df= pd.ExcelFile('data.xlsx',delimiter = ';') #import entire excel file
sheet1=pd.read_excel('data.xlsx',sheetname=0,names=['time','void1','pressure1'])
sheet2=pd.read_excel('data.xlsx',sheetname=1,names=['time','void2','pressure2'])
sheet3=pd.read_excel('data.xlsx',sheetname=2,names=['time','void3','pressure3']) 
sheet4=pd.read_excel('data.xlsx',sheetname=3,names=['time','void4','pressure4'])
sheet5=pd.read_excel('data.xlsx',sheetname=4,names=['time','void5','pressure5'])
sheet6=pd.read_excel('data.xlsx',sheetname=5,names=['time','void6','pressure6'])
sheet7=pd.read_excel('data.xlsx',sheetname=6,names=['time','void7','pressure7'])
sheet8=pd.read_excel('data.xlsx',sheetname=7,names=['time','void8','pressure8'])
sheet10=pd.read_excel('data.xlsx',sheetname=9,names=['time','void10','pressure10'])

#SORT VALUES TO FIND THE UNWANTED DATA
sheet1.sort_values('pressure1',ascending=False).head() #the pressure has noise so sort accordingly

#GET ONLY WANTED DATA WITHOUT NOISE
sheet1_new = sheet1[sheet1.pressure1 <=8] #exclude the noise above 8 bar
sheet2_new = sheet2[sheet2.pressure2 <=8] #exclude the noise above 8 bar
sheet3_new= sheet3[sheet3.pressure3 <=8] #exclude the noise above 8 bar
sheet4_new = sheet4[sheet4.pressure4 <=8] #exclude the noise above 8 bar
sheet5_new = sheet5[sheet5.pressure5 <=8] #exclude the noise above 8 bar
sheet6_new = sheet6[sheet6.pressure6 <=8] #exclude the noise above 8 bar
sheet7_new = sheet7[sheet7.pressure7 <=8] #exclude the noise above 8 bar
sheet8_new = sheet8[sheet8.pressure8 <=8] #exclude the noise above 8 bar
sheet10_new = sheet10[sheet10.pressure10 <=8] #exclude the noise above 8 bar

#MERGE THE DATASETS TO FIND AVERAGE OF ALL SAMPLES

#'MERGE' ONLY MERGES 2 DATAFRAMES AT A TIME
merge12_df = pd.merge(sheet1_new,sheet2_new, on='time')
merge34_df = pd.merge(sheet3_new,sheet4_new, on='time')
merge56_df = pd.merge(sheet5_new,sheet6_new, on='time')
merge78_df = pd.merge(sheet7_new,sheet8_new, on='time')

#MERGE ON FIRST OUTPUT
all_merged = merge12_df.merge(merge34_df, on='time').merge(merge56_df, on = 'time').merge(merge78_df, on = 'time').merge(sheet10_new, on = 'time')
#print(all_merged.head()) #check that all data is merged into one dataframe

#AVERAGE ALL PRESSURES
mean_all_pressures = all_merged[["pressure1", "pressure2","pressure3", "pressure4","pressure5", "pressure6","pressure7", "pressure8", "pressure10"]].mean(axis=1)

#PRINT AVERAGE VS ALL THE SAMPLES GRAPH 
plt.figure(1) 
plt.plot(all_merged.time,mean_all_pressures,'r.') #plot the average of all samples.
plt.plot(sheet1_new.time,sheet1_new.pressure1)
plt.plot(sheet2_new.time,sheet2_new.pressure2)
plt.plot(sheet3_new.time,sheet3_new.pressure3)
plt.plot(sheet4_new.time,sheet4_new.pressure4)
plt.plot(sheet5_new.time,sheet5_new.pressure5)
plt.plot(sheet6_new.time,sheet6_new.pressure6)
plt.plot(sheet7_new.time,sheet7_new.pressure7)
plt.plot(sheet8_new.time,sheet8_new.pressure8)
plt.plot(sheet10_new.time,sheet10_new.pressure10)
plt.legend(['Average','Sample 1','Sample 2','Sample 3','Sample 4','Sample 5','Sample 6','Sample 7','Sample 8','Sample 10'],bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.xlabel('Time (s)'),plt.ylabel('Pressure (bar)') #Specify the plot details
plt.savefig('AllPressures_vs_Average.png') #Save the plot for later use
plt.show() #Display the plot

【问题讨论】:

  • for num in range(1,11): 可以在这里节省很多代码...
  • 平均值是图表上的红点。我的第一张图片没有正确上传。
  • 通过自己明确地进行计算来检查平均值,即对过滤后的压力值求和并除以样本数。
  • 是什么让您认为均值是错误的?乍一看还不错。您是否尝试过打印出值并进行检查?

标签: python pandas dataframe python-import mean


【解决方案1】:

代码中的大部分重复来自于您为每个工作表定义一个单独的变量,然后对每个工作表执行相同的操作。

您可以通过将每张工作表的内容存储到单个字典而不是单独的变量来改进当前代码。

documentation 中,您可以看到通过指定 sheetname = None,您可以将所有工作表作为字典导入。或者,您也可以提供要阅读的工作表列表,在您的情况下为 [0,1,2,...,11],因为它们是 0 索引的。

sheets_dict = pd.read_excel('data.xlsx',sheetname=None,names=['time','void1','pressure1'])

您可以快速查看您使用的内容:

for name, sheet in sheets_dict.iteritems():
    print name, sheet.head()

您可以在需要时单独访问每张工作表:

sheets_dict['sheet_1_name']

这样可以避免很多重复。 例如,过滤将是:

new_sheets_dict = {key: el[el.pressure1 <=8] for key, el in sheets_dict.iteritems)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多