首页 > 解决方案 > 替换熊猫数据框多列中的字符

问题描述

我有一个通过读取 XLSX 文件创建的数据框,我需要用逗号替换很多点,因为我不知道为什么在 Excel 中它显示一个逗号,但在熊猫数据框中它是一个点而不是小数分隔符。我有 29 列用逗号替换点,所以我发现最好使用一个列表来存储我的所有列名,并使用一个 for 循环来迭代我想用逗号替换这些点的所有列。

但不幸的是,当我尝试以下代码时出现错误:

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import win32com.client
import pandas as pd
import pathlib

root = tk.Tk()

canvas1 = tk.Canvas(root, width=300, height=300, bg='lightsteelblue2', relief='raised')
canvas1.pack()

label1 = tk.Label(root, text='File Conversion Tool', bg='lightsteelblue2')
label1.config(font=('helvetica', 20))
canvas1.create_window(150, 60, window=label1)

read_file = pd.DataFrame()


def get_excel_onefolder():
    global read_file
    import_dir_path = filedialog.askdirectory()
    file_ext = "*.xlsx"
    list_xlsx_file = list(pathlib.Path(import_dir_path).glob(file_ext))
    lst_rpl = ['col24', 'col25', 'col26', 'col45', 'col46', 'col47', 'col69', 'col75', 'col76', 'col77', 'col105', 'col106',
               'col107', 'col108', 'col109', 'col110', 'col111', 'col112', 'col254', 'col255', 'col256', 'col257', 'col258',
               'col259', 'col260', 'col261', 'col262', 'col352', 'col353']
    len_lst = len(lst_rpl)
    for xlsx_file_path in list_xlsx_file:
        read_file = pd.read_excel(xlsx_file_path)
        read_file['Time'] = read_file['Time'].str.replace(',', '.')
        for i in range(len_lst):
            read_file[lst_rpl[i]] = read_file[lst_rpl[i]].str.replace('.', ',')
        output_path = str(xlsx_file_path) + ".csv"
        read_file.to_csv(output_path, index=None, header=True, decimal=',', sep=';')
    tk.messagebox.showinfo(title="Import success", message="CSV file import successful !")


XLSX_to_CSV = tk.Button(text="Import Excel File & Convert to CSV", command=get_excel_onefolder, bg='green', fg='white', font=('helvetica', 12, 'bold'))
canvas1.create_window(150, 180, window=XLSX_to_CSV)

root.mainloop()

我得到的错误是 KeyError: 'col24'

编辑:我通过添加 NaN 值的参数来解决我的问题,na_values 到 .read_excel with decimal=',' 现在它工作正常

read_file = pd.read_excel(xlsx_file_path, decimal=',', na_values=['#NV', ' '])

我的问题是因为我的列由于 NaN 值而未被识别为浮点数。

现在的工作功能是:

def get_excel_onefolder():
    global read_file
    import_dir_path = filedialog.askdirectory()
    file_ext = "*.xlsx"
    list_xlsx_file = list(pathlib.Path(import_dir_path).glob(file_ext))
    for xlsx_file_path in list_xlsx_file:
        read_file = pd.read_excel(xlsx_file_path, decimal=',', na_values=['#NV', ' '])
        read_file['Time'] = read_file['Time'].str.replace(',', '.')
        path_without_ext = os.path.splitext(str(xlsx_file_path))[0]
        output_path = path_without_ext + ".csv"
        read_file.to_csv(output_path, index=None, header=True, decimal=',', sep=';')
    tk.messagebox.showinfo(title="Import success", message="CSV file import successful !")

标签: pythonpandas

解决方案


pandas 尝试将逗号自动格式化为点。您可以使用以下参数更改此行为decimal

read_file = pd.read_excel(xlsx_file_path)->read_file = pd.read_excel(xlsx_file_path, decimal=",")


推荐阅读