替换熊猫数据框多列中的字符

时间:2020-08-24 16:44:49

标签: python pandas

我有一个通过读取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并使用小数='来解决我的问题,现在可以正常使用

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 !")

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

    for x in list_col:
       df[list_col] = df[list_col].apply(lamba x: str(x).replace('.' , ',') if '.' in str(x) else x)

不知道此代码对您是否有帮助。如果存在点,此代码段可帮助您将点替换为所有列中的逗号。