Python GUI数据拆分函数问题:替换contains实现精确匹配及兼容非字符串列
DataFrame按列值拆分的代码修正
问题说明
我编写了basic_splitter函数,用于从GUI下拉框获取选中列名,提取该列的所有唯一值,再按每个唯一值生成对应DataFrame并保存为Excel文件。原代码存在两个问题:
- 使用
str.contains会导致同一行被匹配到多个DataFrame中,不符合“每行仅归属一个DataFrame”的需求; - 当目标列类型非字符串时,调用
.str.contains会触发属性错误。
原代码
def basic_splitter(): global df column = combobox_column_list.get() unique_values = df[column].unique() for i in unique_values: # 根据i值拆分原DataFrame为小DataFrame df_output = df[df[column].str.contains(i)] output_path = csv_xlsx_file_path + '/' + i + '.xlsx' df_output.to_excel(output_path, sheet_name = i, index = False) label_after_split = Label(my_frame_1, text = "Saved in: " + csv_xlsx_file_path) label_after_split.grid(row = 4, column = 1)
报错信息
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\orkhamir\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "C:\Users\orkhamir\AppData\Local\Temp\1/ipykernel_1976/2220190921.py", line 76, in basic_splitter df_output = df[df[column].str.contains(i)] raise AttributeError("Can only use .str accessor with string values!") AttributeError: Can only use .str accessor with string values!
我曾尝试将目标列转为字符串类型后运行,但希望找到更合理的精确匹配方案。
修正后的代码
我调整了代码逻辑,解决了上述问题,新代码如下:
def basic_splitter(): global df column = combobox_column_list.get() unique_values = df[column].unique() for i in range(len(unique_values)): # 生成存储文件路径 output_path = 'C:/Users/orkhamir/Desktop/New folder/' + str(unique_values[i]) + '.xlsx' # 精确匹配列值,生成对应DataFrame df_output = df[df[column] == unique_values[i]] df_output.to_excel(output_path, sheet_name = str(unique_values[i]), index = False) label_after_split = Label(my_frame_1, text = "Saved in: " + csv_xlsx_file_path) label_after_split.grid(row = 4, column = 1)
额外优化建议
- 避免全局变量:将
df作为参数传入函数,提升代码的可维护性和复用性; - 优化标签创建:循环中重复创建
Label会导致界面叠加多个相同标签,可提前创建标签并仅更新文本内容:# 提前在函数外或初始化时创建标签 label_after_split = Label(my_frame_1, text="") label_after_split.grid(row=4, column=1) def basic_splitter(df): column = combobox_column_list.get() unique_values = df[column].unique() for val in unique_values: output_path = f'C:/Users/orkhamir/Desktop/New folder/{str(val)}.xlsx' df_output = df[df[column] == val] df_output.to_excel(output_path, sheet_name=str(val), index=False) # 更新标签文本 label_after_split.config(text=f"Saved in: {csv_xlsx_file_path}") - 用groupby替代循环:Pandas的
groupby可以更简洁地实现按列值分组,无需手动处理唯一值:def basic_splitter(df): column = combobox_column_list.get() # 按列值分组,直接遍历分组结果 for val, group_df in df.groupby(column): output_path = f'C:/Users/orkhamir/Desktop/New folder/{str(val)}.xlsx' group_df.to_excel(output_path, sheet_name=str(val), index=False) label_after_split.config(text=f"Saved in: {csv_xlsx_file_path}")
内容的提问来源于stack exchange,提问作者Orkhan
相关产品推荐
相关产品推荐

