Как получить среднее значение выбранных столбцов из нескольких листов в одном файле Excel

#python #excel #pandas #mean

#python #excel #pandas #среднее

Вопрос:

Я работаю с большим файлом Excel, имеющим 22 листа, где каждый лист имеет одинаковые заголовки coulmn, но не имеет равного количества строк. Я хотел бы получить средние значения (за исключением нулей) для столбцов от AA до AX для всех 22 листов. Столбцы имеют заголовки, которые я использую в своем коде.

Вместо того, чтобы читать каждый лист, я хочу перебирать листы и получать на выходе средние значения. С помощью ответов на другие сообщения у меня есть это:

 import pandas as pd

xls = pd.ExcelFile('myexcelfile.xlsx')
xls.sheet_names
#print(xls.sheet_names)
out_df = pd.DataFrame()

for sheets in xls.sheet_names:
    df = pd.read_excel('myexcelfile.xlsx', sheet_names= None)
    df1= df[df[:]!=0]
    df2=df1.loc[:,'aa':'ax'].mean()
    out_df.append(df2)  ## This will append rows of one dataframe to another(just like your expected output)

print(out_df2)

## out_df will have data from all the sheets
  

Код работает до сих пор, но только на одном из листов. Как мне заставить его работать для всех 22 листов?

Ответ №1:

Вы можете использовать numpy для выполнения базовой математики в pandas.DataFrame или pandas.Серия взгляните на мой код ниже

 import pandas as pd, numpy as np

XL_PATH = r'C:UsersYourNamePythonProjectBook1.xlsx'


xlFile = pd.ExcelFile(XL_PATH)
xlSheetNames = xlFile.sheet_names

dfList = []     # variable to store all DataFrame

for shName in xlSheetNames:
    df = pd.read_excel(XL_PATH, sheet_name=shName)  # read sheet X as DataFrame
    dfList.append(df)   # put DataFrame into a list


for df in dfList:
    print(df)
    dfAverage = np.average(df)  # use numpy to get DataFrame average
    print(dfAverage)
  

Комментарии:

1. Привет! Спасибо за ваш вклад. Я сделал это, но все равно он работает только на одном листе.

2. Я использую df = df.replace(0, np.NaN), чтобы исключить нули при получении средних значений

Ответ №2:

 #Try code below

import pandas as pd, numpy as np, os

XL_PATH = "YOUR EXCEL FULL PATH"
SH_NAMES = "WILL CONTAINS LIST OF EXCEL SHEET NAME"
DF_DICT = {} """WILL CONTAINS DICTIONARY OF DATAFRAME"""

def readExcel():
        if not os.path.isfile(XL_PATH): return FileNotFoundError
        SH_NAMES = pd.ExcelFile(XL_PATH).sheet_names
        
        # pandas.read_excel() have argument 'sheet_name'
        # when you put a list to 'sheet_name' argument
        # pandas will return dictionary of dataframe with sheet_name as keys
        DF_DICT = pd.read_excel(XL_PATH, sheet_name=SH_NAMES)
        return SH_NAMES, DF_DICT
        
#Now you have DF_DICT that contains all DataFrame for each sheet in excel
#Next step is to append all rows data from Sheet1 to SheetX
#This will only works if you have same column for all DataFrame

def appendAllSheets():
    dfAp = pd.DataFrame()
    for dict in DF_DICT:
        df = DF_DICT[dict]
        dfAp = pd.DataFrame.append(self=dfAp, other=df)
    return dfAp
    
#you can now call the function as below:
dfWithAllData = appendAllSheets()
#now you have one DataFrame with all rows combine from Sheet1 to SheetX
#you can fixed the data, for example to drop all rows which contain '0'
dfZero_Removed = dfWithAllData[[dfWithAllData['Column_Name'] != 0]]
dfNA_removed = dfWithAllData[not[pd.isna(dfWithAllData['Column_Name'])]]

#last step, to find average or other math operation
#just let numpy do the job
average_of_all_1 = np.average(dfZero_Removed)
average_of_all_2 = np.average(dfNA_Removed)
#show result
#this will show the average of all
#rows of data from Sheet1 to SheetX from your target Excel File
print(average_of_all_1, average_of_all_2)