我正在处理与每年不同运动员的一些运动试验相关的历史数据。数据采用 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
您需要考虑每张纸中的行数。代码的中间部分变成:
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"))
您可以尝试以下方法。某些工作表中可能只有 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