鱼C论坛

 找回密码
 立即注册
楼主: laiyuanjie

我想在ttk的treeview里面展示pandas的Dataframe该怎么做

[复制链接]
发表于 2024-3-21 22:57:41 | 显示全部楼层
laiyuanjie 发表于 2024-03-21 22:57
把代码显示成python的形式


当然,这是修改后的示例代码:
import tkinter as tk
from tkinter import ttk
import pandas as pd

def filter_dataframe():
    # 获取各个筛选条件
    name_keyword = name_entry.get()
    nickname_keyword = nickname_entry.get()
    tian_keyword = tian_entry.get()
    di_keyword = di_entry.get()
    
    # 应用筛选条件
    filtered_df = df[(df['姓名'].str.contains(name_keyword)) &
                     (df['绰号'].str.contains(nickname_keyword)) &
                     (df['天罡'].str.contains(tian_keyword)) &
                     (df['地煞'].str.contains(di_keyword))]
    display_dataframe(filtered_df)

def display_dataframe(df):
    treeview.delete(*treeview.get_children())
    for index, row in df.iterrows():
        treeview.insert('', 'end', values=row.tolist())

# 创建Tkinter窗口
window = tk.Tk()

# 创建一个Treeview控件
treeview = ttk.Treeview(window)

# 添加表头
columns = df.columns.tolist()
treeview['columns'] = columns
for column in columns:
    treeview.heading(column, text=column)

# 从Excel读取数据到DataFrame
df = pd.read_excel('data.xlsx')

# 在Treeview中显示DataFrame的所有数据
display_dataframe(df)

# 创建筛选条件的Entry控件
name_label = tk.Label(window, text='姓名:')
name_label.pack()
name_entry = tk.Entry(window)
name_entry.pack()

nickname_label = tk.Label(window, text='绰号:')
nickname_label.pack()
nickname_entry = tk.Entry(window)
nickname_entry.pack()

tian_label = tk.Label(window, text='天罡:')
tian_label.pack()
tian_entry = tk.Entry(window)
tian_entry.pack()

di_label = tk.Label(window, text='地煞:')
di_label.pack()
di_entry = tk.Entry(window)
di_entry.pack()

button = tk.Button(window, text='查询', command=filter_dataframe)
button.pack()

# 显示TreeView
treeview.pack()

window.mainloop()

请注意,在这个示例代码中,我假设你的Excel表格中的列名分别为“姓名”、“绰号”、“天罡”和“地煞”,你可以根据自己的实际情况进行调整。同时,请确保已经安装了必要的库(例如pandas、tkinter等),否则代码可能无法正常运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-21 23:03:34 | 显示全部楼层
FishC 发表于 2024-3-21 22:57
当然,这是修改后的示例代码:

如果我的表是有日期的呢?输入一个开始日期,一个结束日期,然后将dataframe中的日期那一列在这连个日期区间里面的内容全部显示出来呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-21 23:03:48 | 显示全部楼层
laiyuanjie 发表于 2024-03-21 23:03
如果我的表是有日期的呢?输入一个开始日期,一个结束 ...


如果你想根据日期区间筛选数据并显示在TreeView中,可以按照如下方式修改代码:
import tkinter as tk
from tkinter import ttk
import pandas as pd

def filter_dataframe():
    # 获取开始日期和结束日期
    start_date = start_date_entry.get()
    end_date = end_date_entry.get()
    
    # 转换为日期格式
    start_date = pd.to_datetime(start_date)
    end_date = pd.to_datetime(end_date)
    
    # 根据日期区间筛选数据
    filtered_df = df[(df['日期'] >= start_date) & (df['日期'] <= end_date)]
    
    # 显示筛选后的数据
    display_dataframe(filtered_df)

def display_dataframe(df):
    treeview.delete(*treeview.get_children())
    for index, row in df.iterrows():
        treeview.insert('', 'end', values=row.tolist())

# 创建Tkinter窗口
window = tk.Tk()

# 创建一个Treeview控件
treeview = ttk.Treeview(window)

# 添加表头
columns = df.columns.tolist()
treeview['columns'] = columns
for column in columns:
    treeview.heading(column, text=column)

# 从Excel读取数据到DataFrame
df = pd.read_excel('data.xlsx')

# 在Treeview中显示DataFrame的所有数据
display_dataframe(df)

# 创建开始日期和结束日期的Entry控件
start_date_label = tk.Label(window, text='开始日期:')
start_date_label.pack()
start_date_entry = tk.Entry(window)
start_date_entry.pack()

end_date_label = tk.Label(window, text='结束日期:')
end_date_label.pack()
end_date_entry = tk.Entry(window)
end_date_entry.pack()

button = tk.Button(window, text='查询', command=filter_dataframe)
button.pack()

# 显示TreeView
treeview.pack()

window.mainloop()

在这个示例代码中,我使用了名为"日期"的列作为日期列,你可以根据自己的实际情况进行修改。输入开始日期和结束日期后,程序会根据日期区间筛选数据,并将筛选结果显示在TreeView中。请确保已经安装了必要的库(例如pandas、tkinter等),否则代码可能无法正常运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-24 22:08:19 | 显示全部楼层
FishC 发表于 2024-3-21 23:03
如果你想根据日期区间筛选数据并显示在TreeView中,可以按照如下方式修改代码:

给我加个Y轴的滚动条
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-24 22:08:38 | 显示全部楼层
laiyuanjie 发表于 2024-03-24 22:08
给我加个Y轴的滚动条


要在ttk的treeview中添加垂直滚动条,你可以使用ttk的Scrollbar组件与treeview进行关联。

下面是更新后的代码示例:
import tkinter as tk
from tkinter import ttk
import pandas as pd

def filter_dataframe():
    start_date = start_date_entry.get()
    end_date = end_date_entry.get()
    
    start_date = pd.to_datetime(start_date)
    end_date = pd.to_datetime(end_date)
    
    filtered_df = df[(df['日期'] >= start_date) & (df['日期'] <= end_date)]
    display_dataframe(filtered_df)

def display_dataframe(df):
    treeview.delete(*treeview.get_children())
    for index, row in df.iterrows():
        treeview.insert('', 'end', values=row.tolist())

# 创建Tkinter窗口
window = tk.Tk()

# 创建一个Treeview控件
treeview = ttk.Treeview(window)

# 添加表头
columns = df.columns.tolist()
treeview['columns'] = tuple(columns)
for column in columns:
    treeview.heading(column, text=column)

# 从Excel读取数据到DataFrame
df = pd.read_excel('data.xlsx')

# 在Treeview中显示DataFrame的所有数据
display_dataframe(df)

# 创建一个Entry控件用于输入筛选关键字
start_date_entry = tk.Entry(window)
start_date_entry.pack()
end_date_entry = tk.Entry(window)
end_date_entry.pack()

button = tk.Button(window, text='查询', command=filter_dataframe)
button.pack()

# 创建垂直滚动条
vsb = ttk.Scrollbar(window, orient='vertical', command=treeview.yview)
vsb.pack(side='right', fill='y')

# 设置TreeView的垂直滚动条
treeview.configure(yscrollcommand=vsb.set)

# 显示TreeView
treeview.pack()

window.mainloop()

在上述代码中,我们添加了一个ttk.Scrollbar组件,并与treeview控件进行了关联。通过configure方法将滚动条设置为Treeview的垂直滚动条。

这样,当treeview中的内容超过窗口高度时,会出现垂直滚动条来滑动查看全部数据。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:04:10 | 显示全部楼层
    def get_sheet(self):
        # 从Excel读取数据到DataFrame

        self.df1 = pd.read_excel(self.file_path, index_col=None)

——————————————————————————————————————————
        csv_path = os.path.join(path_all.service_csv_path,"2024.csv")
        self.ddf = pd.read_csv(csv_path)
        print(self.ddf)

        self.df1 = self.ddf



——————————————————————————
        self.df = self.df1[['日期', '车号', '服务项目', '现金']].fillna(method='ffill')
        self.df["现金"] = self.df["现金"].astype(float)
        self.df['日期'] = pd.to_datetime(self.df['日期'])
        self.df['日期'] = self.df['日期'].dt.date

        self.df['车号'] = self.df['车号'].str.upper()
        self.df = self.df.dropna(axis=1, how='all')
        # 在Treeview中显示DataFrame的所有数据
        self.display_dataframe(self.df)

两条横线之间是我置换的CSV文件,,为什么用EXCEL就可以在treeview上展现,,我弄成csv就没办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:04:27 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:04
def get_sheet(self):
        # 从Excel读取数据到D ...


根据您提供的代码,我注意到在读取CSV文件后,进行了一系列数据处理操作。可能是其中某些操作导致无法正确显示在treeview中。以下是可能导致问题的几点建议和解决方法:

1. 检查CSV文件的内容:确保CSV文件中的数据与您期望的格式和内容一致。特别注意日期数据的格式,确保在转换为日期前,日期数据已正确加载。

2. 调整日期转换方式:根据您的需求,可以尝试不将日期转换为字符串(`.dt.date`),而是保留为pandas的日期类型。这样可以更好地处理和筛选日期数据。

3. 检查数据处理步骤:对于数据处理步骤,请确保每个操作都符合您的预期,并检查每个步骤的输出结果。可以逐个注释掉操作,然后逐步恢复,查看是否出现问题。

4. 确保正确应用DataFrame到Treeview:在display_dataframe函数中,您需要确保正确地将处理后的DataFrame传递给treeview来显示。请检查相关的代码部分,确保没有误删除或误修改。

如果问题仍然存在,请提供更多关于错误信息或特定的问题描述,以便我能够更准确地帮助您解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:12:14 | 显示全部楼层
FishC 发表于 2024-3-31 14:04
根据您提供的代码,我注意到在读取CSV文件后,进行了一系列数据处理操作。可能是其中某些操作导致无法 ...

self.file.to_csv(self.file_path,mode='a', header=(['日期', '车号', '服务项目', '现金']), index=False)


这个是我在写入CSV时的代码,我要怎么写菜式我上面的代码每一列的格式内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:12:34 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:12
self.file.to_csv(self.file_path,mode='a', header=( ...


根据你提供的代码,你想要将DataFrame写入CSV文件,并且希望指定每一列的格式和内容。你可以使用pandas的to_csv方法来实现这个目标。以下是一个示例代码,演示了如何指定列的格式和内容:
# 定义菜单数据
menu_data = {
    '菜名': ['宫保鸡丁', '麻婆豆腐', '水煮鱼'],
    '价格': [30, 25, 50],
    '口味': ['辣', '麻辣', '重辣']
}

# 创建DataFrame
df = pd.DataFrame(menu_data)

# 定义列的格式和内容
column_formats = {
    '菜名': str,       # 将菜名列的数据类型设置为字符串
    '价格': '${:.2f}',  # 将价格列的数据格式化为带有两位小数的货币格式
    '口味': lambda x: x.upper()  # 将口味列的值转换为大写字母
}

# 格式化DataFrame的列
for column, fmt in column_formats.items():
    df[column] = df[column].apply(fmt.format)

# 将DataFrame写入CSV文件
df.to_csv('menu.csv', index=False)

在这个示例中,我们首先创建了一个包含菜单数据的DataFrame。然后,我们使用column_formats字典来定义每一列的格式和内容。通过循环遍历字典,我们将每一列的值应用对应的格式或转换函数。最后,我们使用to_csv方法将DataFrame写入CSV文件。

请根据你的具体需求调整column_formats字典中的内容和格式,以便满足你的要求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:14:03 | 显示全部楼层
FishC 发表于 2024-3-31 14:12
根据你提供的代码,你想要将DataFrame写入CSV文件,并且希望指定每一列的格式和内容。你可以使用pandas ...

我的日期列是要弄成pandas的日期形式的格式,现金要弄成浮点数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:14:15 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:14
我的日期列是要弄成pandas的日期形式的格式,现金要弄 ...


如果你想将日期列转换成pandas的日期格式,并且将现金列转换为浮点数格式,可以使用pandas中的to_datetime函数和astype方法来完成。下面是一个示例代码:# 将日期列转换为pandas的日期格式df['日期'] = pd.to_datetime(df['日期'])# 将现金列转换为浮点数格式df['现金'] = df['现金'].astype(float)在这个示例中,我们假设日期列的名称是"日期",现金列的名称是"现金"。通过调用pd.to_datetime函数,我们可以将"日期"列中的字符串转换为pandas的日期格式。然后,通过使用astype方法和float参数,我们可以将"现金"列的数据类型转换为浮点数格式。请根据你的具体数据列名称进行相应的调整。如果你的日期列有特定的日期格式,请参考pandas的日期字符串格式指南(https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior)来指定适当的日期格式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:14:50 | 显示全部楼层
FishC 发表于 2024-3-31 14:14
如果你想将日期列转换成pandas的日期格式,并且将现金列转换为浮点数格式,可以使用pandas中的to_datet ...

显示成python的代码样式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:15:08 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:14
显示成python的代码样式


以下是示例代码的完整版本,展示了如何将日期列转换为pandas的日期格式以及将现金列转换为浮点数格式:
import tkinter as tk
from tkinter import ttk
import pandas as pd

def filter_dataframe():
    keyword = entry.get()
    filtered_df = df[df.str.contains(keyword)]
    display_dataframe(filtered_df)

def display_dataframe(df):
    treeview.delete(*treeview.get_children())
    for index, row in df.iterrows():
        treeview.insert('', 'end', values=row.tolist())

# 创建Tkinter窗口
window = tk.Tk()

# 创建一个Treeview控件
treeview = ttk.Treeview(window)

# 添加表头
columns = df.columns.tolist()
treeview['columns'] = columns
for column in columns:
    treeview.heading(column, text=column)

# 从Excel读取数据到DataFrame
df = pd.read_excel('data.xlsx')

# 将日期列转换为pandas的日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 将现金列转换为浮点数格式
df['现金'] = df['现金'].astype(float)

# 在Treeview中显示DataFrame的所有数据
display_dataframe(df)

# 创建一个Entry控件用于输入筛选关键字
entry = tk.Entry(window)
entry.pack()

button = tk.Button(window, text='查询', command=filter_dataframe)
button.pack()

# 显示TreeView
treeview.pack()

window.mainloop()

请注意,这只是一个示例模板,你需要根据你的实际数据和需求进行适当的修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:22:34 | 显示全部楼层
FishC 发表于 2024-3-31 14:15
以下是示例代码的完整版本,展示了如何将日期列转换为pandas的日期格式以及将现金列转换为浮点数格式: ...

        csv_path = os.path.join(path_all.service_csv_path,"2024.csv")
        self.ddf = pd.read_csv(csv_path)
        self.ddf['日期'] = pd.to_datetime(self.ddf['日期'])
        self.ddf['现金'] = self.ddf['现金'].astype(float)
        self.ddf['车号'] = self.ddf['车号'].str.upper()


dateutil.parser._parser.ParserError: Unknown string format: 日期
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:22:47 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:22
csv_path = os.path.join(path_all.service_csv_path, ...


看起来你遇到了一个关于日期格式的问题。根据你提供的代码,你试图将一个字符串类型的列转换为日期类型。但是,pandas的to_datetime函数需要知道日期的具体格式才能正确解析。

你可以尝试使用`pd.to_datetime`的`format`参数来指定日期的格式。例如,在你的代码中,如果日期列的格式为“年-月-日”,你可以使用以下代码进行转换:
self.ddf['日期'] = pd.to_datetime(self.ddf['日期'], format='%Y-%m-%d')

在上面的代码中,`'%Y-%m-%d'`表示日期的格式为四位数年份、两位数月份和两位数日期,以连字符分隔。

请根据你的实际日期格式进行适当的修改,然后再尝试一下。希望这可以解决你的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:23:51 | 显示全部楼层
FishC 发表于 2024-3-31 14:22
看起来你遇到了一个关于日期格式的问题。根据你提供的代码,你试图将一个字符串类型的列转换为日期类型 ...

ValueError: time data 日期 doesn't match format specified
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:24:08 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:23
ValueError: time data 日期 doesn't match format sp ...


看起来你提供的输入数据与指定的日期格式不匹配,导致了一个值错误(ValueError)。请确保你使用正确的日期格式来解析日期字符串。

有时候,日期字符串的格式可能是非常特殊的,不适用于常见的日期格式。在这种情况下,你可能需要手动编写一个日期解析函数来处理非标准的日期格式。

下面是一个示例代码,用于演示如何通过自定义日期解析函数来解析非标准的日期字符串:
import pandas as pd
from datetime import datetime

def custom_date_parser(date_str):
    # 自定义日期解析函数
    try:
        date = datetime.strptime(date_str, "%Y%m%d")
        return date
    except ValueError:
        raise ValueError("日期格式不正确!")

csv_path = os.path.join(path_all.service_csv_path, "2024.csv")
self.ddf = pd.read_csv(csv_path, parse_dates=["日期"], date_parser=custom_date_parser)

在上面的代码中,我们定义了一个名为`custom_date_parser`的自定义日期解析函数,它使用`strptime`函数将字符串解析为日期对象。你可以根据你实际的日期格式修改此函数。

然后,我们在`pd.read_csv`函数中使用`parse_dates`参数将日期列指定为需要解析的列,使用`date_parser`参数传递自定义的日期解析函数。

运行上述代码后,应该能够正确解析非标准的日期字符串。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:26:56 | 显示全部楼层
日期的 样式是这样的
微信图片_20240331142629.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 14:27:15 | 显示全部楼层
laiyuanjie 发表于 2024-03-31 14:26
日期的 样式是这样的


如果你的日期样式是这样的:"日期",可以使用以下代码将其转换为pandas的日期格式:import pandas as pd# 读取CSV文件df = pd.read_csv("your_file.csv")# 转换日期列df['日期'] = pd.to_datetime(df['日期'], fo

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:28:16 | 显示全部楼层
FishC 发表于 2024-3-31 14:27
如果你的日期样式是这样的:"日期",可以使用以下代码将其转换为pandas的日期格式:import pandas as p ...


        self.ddf = pd.read_csv(csv_path)
        self.ddf['日期'] = pd.to_datetime(self.ddf['日期'],format='%Y-%m-%d')


这个就我读CSV时的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 12:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表