python - 替换熊猫数据框多列中的字符
问题描述
我有一个通过读取 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 !")
解决方案
pandas 尝试将逗号自动格式化为点。您可以使用以下参数更改此行为decimal
:
read_file = pd.read_excel(xlsx_file_path)
->read_file = pd.read_excel(xlsx_file_path, decimal=",")
推荐阅读
- php - 当我重定向到创建页面时,在 laravel 中调用 null 上的成员函数角色()
- javascript - 在javascript中用国家代码替换零时删除空格?
- javascript - ckeditor 5 在线生成器未显示
- html - IE 自动化 VBA - 如何在没有任何文本的情况下访问跨度按钮
- r - 如何克服 Schur 补码中的数值问题来更新逆矩阵
- go - 如何处理来自正确用户的消息
- python - Python Pandas Dataframe:根据单独的列取下一个较小的值
- r - BIC() 和 regsubsets() 给了我不同的答案
- javascript - JS addEventListener 无法始终如一地工作
- multicast - JGroups:为傻瓜解释 mcast_addr