只有当 运行 通过 Tkinter 时,数据帧的真值才是模糊的

The truth value of a dataframe is ambiguous only when running it through Tkinter

我有一个函数应该计算 pandas 数据框中某些值的均值和中值,然后通过 Tkinter Treeview 显示它们。我已经在没有 Tkinter 的情况下测试了该功能并且它工作得很好,但是如果我 运行 使用它,它会给出这个错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这是我的代码:

def zip_mean_median():
    global clean_df
    clean_df['ACTIVITY DATE'] = pd.to_datetime(clean_df['ACTIVITY DATE']).dt.normalize()
    clean_df = clean_df.sort_values(by=['ACTIVITY DATE'])
    clean_df = clean_df.groupby([clean_df['ACTIVITY DATE'].dt.year, 'FACILITY ZIP'])['SCORE'].agg(['mean', 'median'])
    clean_df = ttk.Treeview(clean_df)
    clean_df.pack()

您不能将数据框直接传递给ttk.Treeview,您需要手动构建它。这可以通过以下函数完成

import tkinter as tk
from tkinter import ttk

def dataframe_to_treeview(root, dataframe):
    tree = ttk.Treeview(root, show='headings')
    columns = list(dataframe.columns)

    tree["columns"] = columns
    tree.pack(expand=tk.TRUE, fill=tk.BOTH)

    for i in columns:
        tree.column(i, anchor=tk.W)
        tree.heading(i, text=i, anchor=tk.W)

    for i, row in dataframe.iterrows():
        tree.insert("", "end", values=list(row))

    return tree

例如,您可以按如下方式使用此功能:

import pandas as pd

inp = [{'Currency': 'EUR', 'Volume': '100', 'Country': 'SE'},
       {'Currency': 'GBP', 'Volume': '200', 'Country': 'SE'},
       {'Currency': 'CAD', 'Volume': '300', 'Country': 'SE'},
       {'Currency': 'EUR', 'Volume': '400', 'Country': 'SE'},
       {'Currency': 'EUR', 'Volume': '100', 'Country': 'DK'},
       {'Currency': 'GBP', 'Volume': '200', 'Country': 'DK'},
       {'Currency': 'CAD', 'Volume': '300', 'Country': 'DK'},
       {'Currency': 'EUR', 'Volume': '400', 'Country': 'DK'},
       ]
df = pd.DataFrame(inp)
root = tk.Tk()
tree = dataframe_to_treeview(root, df)
root.mainloop()