鱼C论坛

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

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

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


当然,这是修改后的示例代码:

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import pandas as pd

  4. def filter_dataframe():
  5.     # 获取各个筛选条件
  6.     name_keyword = name_entry.get()
  7.     nickname_keyword = nickname_entry.get()
  8.     tian_keyword = tian_entry.get()
  9.     di_keyword = di_entry.get()
  10.    
  11.     # 应用筛选条件
  12.     filtered_df = df[(df['姓名'].str.contains(name_keyword)) &
  13.                      (df['绰号'].str.contains(nickname_keyword)) &
  14.                      (df['天罡'].str.contains(tian_keyword)) &
  15.                      (df['地煞'].str.contains(di_keyword))]
  16.     display_dataframe(filtered_df)

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

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

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

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

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

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

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

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

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

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

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

  53. # 显示TreeView
  54. treeview.pack()

  55. window.mainloop()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果我的表是有日期的呢?输入一个开始日期,一个结束日期,然后将dataframe中的日期那一列在这连个日期区间里面的内容全部显示出来呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import pandas as pd

  4. def filter_dataframe():
  5.     # 获取开始日期和结束日期
  6.     start_date = start_date_entry.get()
  7.     end_date = end_date_entry.get()
  8.    
  9.     # 转换为日期格式
  10.     start_date = pd.to_datetime(start_date)
  11.     end_date = pd.to_datetime(end_date)
  12.    
  13.     # 根据日期区间筛选数据
  14.     filtered_df = df[(df['日期'] >= start_date) & (df['日期'] <= end_date)]
  15.    
  16.     # 显示筛选后的数据
  17.     display_dataframe(filtered_df)

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

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

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

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

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

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

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

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

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

  46. # 显示TreeView
  47. treeview.pack()

  48. window.mainloop()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

给我加个Y轴的滚动条
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

  4. def filter_dataframe():
  5.     start_date = start_date_entry.get()
  6.     end_date = end_date_entry.get()
  7.    
  8.     start_date = pd.to_datetime(start_date)
  9.     end_date = pd.to_datetime(end_date)
  10.    
  11.     filtered_df = df[(df['日期'] >= start_date) & (df['日期'] <= end_date)]
  12.     display_dataframe(filtered_df)

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

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

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

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

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

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

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

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

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

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

  42. # 显示TreeView
  43. treeview.pack()

  44. window.mainloop()
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://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就没办法
小甲鱼最新课程 -> https://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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://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时的代码,我要怎么写菜式我上面的代码每一列的格式内容
小甲鱼最新课程 -> https://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方法来实现这个目标。以下是一个示例代码,演示了如何指定列的格式和内容:

  1. # 定义菜单数据
  2. menu_data = {
  3.     '菜名': ['宫保鸡丁', '麻婆豆腐', '水煮鱼'],
  4.     '价格': [30, 25, 50],
  5.     '口味': ['辣', '麻辣', '重辣']
  6. }

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

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

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

  18. # 将DataFrame写入CSV文件
  19. df.to_csv('menu.csv', index=False)
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的日期列是要弄成pandas的日期形式的格式,现金要弄成浮点数
小甲鱼最新课程 -> https://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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

显示成python的代码样式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

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

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

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

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

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

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

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

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

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

  34. # 显示TreeView
  35. treeview.pack()

  36. window.mainloop()
复制代码

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://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: 日期
小甲鱼最新课程 -> https://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`参数来指定日期的格式。例如,在你的代码中,如果日期列的格式为“年-月-日”,你可以使用以下代码进行转换:

  1. self.ddf['日期'] = pd.to_datetime(self.ddf['日期'], format='%Y-%m-%d')
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

ValueError: time data 日期 doesn't match format specified
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

  1. import pandas as pd
  2. from datetime import datetime

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

  10. csv_path = os.path.join(path_all.service_csv_path, "2024.csv")
  11. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 14:26:56 | 显示全部楼层
日期的 样式是这样的
微信图片_20240331142629.png
小甲鱼最新课程 -> https://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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://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时的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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