如何考虑试验计数条件,每年从单独的 Excel 文件中提取最快和最慢的值,并使用 Python 组合结果?

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

我正在处理与每年不同运动员的一些运动试验相关的历史数据。数据采用 Excel 格式,我们每年有一个 Excel 文件,用于存储不同运动员的轨迹数据,其中每张表格包含一名运动员的数据。例如,数据如下所示:

Sheet 1: 
SheetName: 14056
Data: 
Candidate   Trial ID    Performance
14056   11001   194.129
14056   11002   92.947
14056   11003   262.029
Sheet 2: 
SheetName: 14057
Data: 
Candidate   Trial ID    Performance
14057   12001   22.36
14057   12002   145.21
14057   12003   78.9
14057   12004   69.23

这样的例子不胜枚举,我们有数百张具有相似数据的工作表。

从这些数据中,我想得到每个运动员一年中最快和最慢的越野表现。因此,我想阅读所有这些 Excel 表,处理数据,以便获得每个运动员的最快和最慢时间,将所有这些合并到一张表中并保存为单独的 Excel。然而,我有以下条件:

如果一张表有四个或更多的试验数据,那么我需要获得每个运动员的两个最快和两个最慢的表现。如果试验少于四次,我只需要为每位运动员提供一个最快和最慢的结果。

我在 python 中编写了以下函数,用于获取输入数据并对其进行处理。但现在,无论情况如何,我都会为每位运动员获得两个最快和两个最慢的时间。例如,如果我在输入文件中只有两个试验数据,则此函数会将两个试验保存为两个最慢的和两个最快的。

我对 python 的经验最少,因此我们将非常感谢任何帮助。

def process_excel_file(input_data):
    logger.info(f"Processing file: {input_data}")
    xlsx = pd.ExcelFile(input_data)
    fastest_data = []
    slowest_data = []

    for sheet in xlsx.sheet_names:
        df = pd.read_excel(input_data, sheet_name=sheet)
        if not df.empty:
            df["Performance"] = pd.to_numeric(df["Performance"], errors="coerce")
            df.dropna(subset=["Performance"], inplace=True)
            df = df.sort_values(by="Performance")

            fastest_data.append(df.nsmallest(2, "Performance"))
            slowest_data.append(df.nlargest(2, "Performance"))

    fastest = pd.concat(fastest_data)
    slowest = pd.concat(slowest_data)

    fastest["Category"] = "Fastest Trial"
    slowest["Category"] = "Slowest Trial"
    combined_data = pd.concat([fastest, slowest])
    combined_data.sort_values(by="Candidate", inplace=True)

    return combined_data
python excel sorting concatenation
2个回答
0
投票

您需要考虑每张纸中的行数。代码的中间部分变成:

df = df.sort_values(by="Performance")
n = 2 if df.shape[0] >= 4 else 1
fastest_data.append(df.nsmallest(n, "Performance"))
slowest_data.append(df.nlargest(n, "Performance"))

0
投票

您可以尝试以下方法。某些工作表中可能只有 1 行,因此您不希望将单个值表示为最快和最慢。更新后的功能也将帮助您跟踪这些内容。

def process_excel_file(input_data):
    logger.info(f"Processing file: {input_data}")
    xlsx = pd.ExcelFile(input_data)
    fastest = pd.DataFrame(columns=["Candidate", "Trial ID", "Performance"])
    slowest = pd.DataFrame(columns=["Candidate", "Trial ID", "Performance"])
    for sheet in xlsx.sheet_names:
        df = pd.read_excel(input_data, sheet_name=sheet)
        if not df.empty:
            df["Performance"] = pd.to_numeric(df["Performance"], errors="coerce")
            df.dropna(subset=["Performance"], inplace=True)
            df = df.sort_values(by="Performance")
            num_trials = len(df)
            num_res = 2 if num_trials >= 4 else 1
            fastest_performances = df.nsmallest(num_res, "Performance")
            slowest_performances = df.nlargest(num_res, "Performance")

            if num_trials == 1:
                fastest = pd.concat([fastest, df[["Candidate", "Trial ID", "Performance"]]])
            else:
                fastest = pd.concat([fastest, fastest_performances[["Candidate", "Trial ID", "Performance"]]])
                slowest = pd.concat([slowest, slowest_performances[["Candidate", "Trial ID", "Performance"]]])

    fastest["Category"] = "Fastest Trial"
    slowest["Category"] = "Slowest Trial"
    combined_data = pd.concat([fastest, slowest])
    combined_data.sort_values(by="Candidate", inplace=True)

    return combined_data
© www.soinside.com 2019 - 2024. All rights reserved.