pandas 如何将panda.io.formats.style.styler对象显示在彼此顶部

qni6mghb  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(170)

以下是一些数据:

import numpy as np
import random
import pandas as pd

random.seed(365)

duration = np.random.exponential(scale = 5, size = 100).round(1)
numbers = np.random.normal(loc = 50, scale = 2, size = 100).round(2)
group = np.random.choice(["A", "B", "C", "D"], size = len(duration))
gender = np.random.choice(["Male", "Female"], p = [0.7, 0.3], size = len(duration))
provider = np.random.choice(["2Degrees", "Skinny", "Vodafone", "Spark"], p = [0.25, 0.25, 0.25, 0.25], size = len(duration))

df = pd.DataFrame(
    {"Duration":duration,
    "Numbers":numbers,
    "Group":group,
    "Gender":gender,
    "Provider":provider}
)

我试图将多个pandas.styler对象连接到一个图形中。
我把图中的所有“部分”都作为单独的pandas.styler对象,这些对象是我创建的 Dataframe ,并对它们进行了“样式化”,使它们拥有自己的标题。
下面是我用来生成图中前两个“片段”的代码(我用来生成其他片段的其他代码与此非常相似):

#Gets the number of rows and columns
pd.DataFrame({
    "Number of Rows":df.shape[0],
    "Number of Columns":df.shape[1]
}, index = [""])

#Gets the info on the data set's categorical columns
data = []

for column in df:
    if df[column].dtype == "object":
        freq = df[column].value_counts(ascending = False)
        data.append({
            "Column Name":column,
            "Unique Values":len(df[column].unique()),
            "Missing Values":df[column].isna().sum(),
            "Most Frequently Occurring":freq.index[0],
            "Occurrences":freq[0],
            "% of Total":freq[0] / freq.sum()*100
        })
pd.DataFrame(data).style.format(precision = 1).set_caption("Categorical Columns").set_table_styles([{
    "selector": "caption",
    "props": [
        ("font-size", "16px")
    ]
}])

我试图创建的图形看起来像这样(这是我在Excel电子表格中创建的):

可以看到,pandas.style对象(除了第一个 Dataframe ,它表示数据集中的行数和列数)堆叠在每个对象的顶部,它们之间有足够的填充
理想情况下,整个图可以导出到Excel电子表格中。
我几乎有我需要的所有代码,它只是得到这最后一部分在一起,我需要帮助。任何想法如何解决这个问题?

wnrlj8wa

wnrlj8wa1#

经过一番研究,我发现整个图形的每一个“片段”都必须首先呈现为HTML代码,然后这些“片段”(现在是HTML字符串)需要通过在它们之间放置填充符来连接。
对于那些将来可能希望创建类似数据汇总表的人,我将把我的代码留在这里:

from IPython.display import display, HTML

styles = [{"selector":"caption", "props":[("font-size", "16px"), ("font-weight", "bold")]}]

head = pd.DataFrame({
    "Number of Rows":df.shape[0],
    "Number of columns":df.shape[1]
}, index = [""]).style\
    .set_caption("Data Frame")\
    .set_table_styles(styles)\
    .to_html()

data = []

#Info obtained from categorical columns
for column in df:
    if df[column].dtype == "object":
        freq = df[column].value_counts(dropna = False, ascending = False)
        data.append({
            "Column Name":column,
            "Unique Values":len(df[column].unique()),
            "Missing Values":df[column].isna().sum(),
            "Most Frequently Occurring":freq.index[0],
            "Occurrences":freq[0],
            "% of Total":freq[0] / freq.sum()*100,
        })
    
cat = pd.DataFrame(data).style.set_caption("Categorical Columns")\
    .set_table_styles(styles)\
    .format(precision = 1)\
    .hide_index()\
    .to_html()

data = []

#Info obtained from numeric columns
for column in df:
    if df[column].dtype in ["int", "float"]:
        data.append({
            "Column Name":column,
            "Unique Values":len(df[column].unique()),
            "Missing Values":df[column].isna().sum(),
            "Range":[df[column].min(), df[column].max()],
            "Mean Value":df[column].mean(),
            "Median Value":df[column].median()
        })
    
num = pd.DataFrame(data).style.set_caption("Numeric Columns")\
    .set_table_styles(styles)\
    .format(precision = 1)\
    .hide_index()\
    .to_html()

padding = "<div style='padding: 20px;'></div>"
figure = padding.join([head, cat, num])

display(HTML(figure))

相关问题