冻结熊猫数据框中的标头

Posted

技术标签:

【中文标题】冻结熊猫数据框中的标头【英文标题】:Freeze header in pandas dataframe 【发布时间】:2015-04-30 23:13:35 【问题描述】:

有没有一种方法可以冻结 Pandas 数据帧标题就像我们在 excel 中所做的那样。因此,如果它是一个包含多行的长数据帧,我们可以在向下滚动时看到标题!我假设 ipython 笔记本

【问题讨论】:

你有想过这个吗? 不,我无法弄清楚 【参考方案1】:

这个函数可以解决问题:

from ipywidgets import interact, IntSlider
from IPython.display import display

def freeze_header(df, num_rows=30, num_columns=10, step_rows=1,
                  step_columns=1):
    """
    Freeze the headers (column and index names) of a Pandas DataFrame. A widget
    enables to slide through the rows and columns.

    Parameters
    ----------
    df : Pandas DataFrame
        DataFrame to display
    num_rows : int, optional
        Number of rows to display
    num_columns : int, optional
        Number of columns to display
    step_rows : int, optional
        Step in the rows
    step_columns : int, optional
        Step in the columns

    Returns
    -------
    Displays the DataFrame with the widget
    """
    @interact(last_row=IntSlider(min=min(num_rows, df.shape[0]),
                                 max=df.shape[0],
                                 step=step_rows,
                                 description='rows',
                                 readout=False,
                                 disabled=False,
                                 continuous_update=True,
                                 orientation='horizontal',
                                 slider_color='purple'),
              last_column=IntSlider(min=min(num_columns, df.shape[1]),
                                    max=df.shape[1],
                                    step=step_columns,
                                    description='columns',
                                    readout=False,
                                    disabled=False,
                                    continuous_update=True,
                                    orientation='horizontal',
                                    slider_color='purple'))
    def _freeze_header(last_row, last_column):
        display(df.iloc[max(0, last_row-num_rows):last_row,
                        max(0, last_column-num_columns):last_column])

测试它:

import pandas as pd
df = pd.DataFrame(pd.np.random.RandomState(seed=0).randint(low=0,
                                                           high=100,
                                                           size=[200, 50]))
freeze_header(df=df, num_rows=10)

结果(颜色在~/.jupyter/custom/custom.css 文件中自定义):

【讨论】:

简洁的解决方案,但是如果您的数据在宽度上波动(即 100 个字符的字符串与 20 个字符的字符串),那么列会在您滚动时跳来跳去,这使得难以理解。对此有什么解决方法的想法吗? 这很棒,但它会降低 pandas 数据框的样式。比如我尝试生成的热图不再生效 corr.style.background_gradient(cmap='coolwarm').set_precision(2)【参考方案2】:

老问题,但想重新审视它,因为我最近找到了解决方案。使用 qgrid 模块:https://github.com/quantopian/qgrid

这不仅允许您在标题冻结的情况下滚动,还可以对内联进行排序、过滤、编辑和其他一些操作。非常有帮助。

【讨论】:

这对我有用。但是,请注意,其 Github 页面上的 Qgrid 未在 Jupyter 实验室 3.0 中进行测试。因此,如果使用 Jupyter 实验室 3,请尝试此处列出的安装方法github.com/quantopian/qgrid/issues/350【参考方案3】:

试试熊猫的Sticky Headers:

import pandas as pd
import numpy as np

bigdf = pd.DataFrame(np.random.randn(16, 100))
bigdf.style.set_sticky(axis="index")

(这个功能是最近推出的,我发现它在 pandas 1.3.1 上工作,但在 1.2.4 上没有)

【讨论】:

这包含与上面类似的代码,但实际上在我的 jupyter 版本 github.com/pandas-dev/pandas/issues/29072 中有效【参考方案4】:

适用于任何编辑器的解决方案是选择要查看的行:

df.ix[100:110] # would show you from row 101 to 110 keeping the header on top

【讨论】:

以上是关于冻结熊猫数据框中的标头的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用数据框中的其他列来聚合熊猫数据框中的列

比较熊猫数据框中的行值

如何在 Pandas 数据框中的特定位置插入一列? (更改熊猫数据框中的列顺序)

熊猫数据框中的逻辑索引[重复]

附加到熊猫数据框中的列表

使用字典替换熊猫数据框中的单词