假设我在Pandas 中有这样一个数据帧:

df = pd.DataFrame({'a':[4,4,8,8],'b':[4,5,6,5], 'd':[0,1,2,1]})
multi_idx = pd.MultiIndex.from_arrays([[0,0,1,1],[0,1,0,1]])
df.index= multi_idx

它输出这个形状:

     a  b  d
0 0  4  4  0
  1  4  5  1
1 0  8  6  2
  1  8  5  1

您可以看到,列a的值是基于第一级索引重复的.我正在寻找一种方法来避免这种重复.当然,其中之一是将信息拆分到更多的数据帧上,即,具有用于列a和第一级索引的数据帧.然而,我想知道是否有一种方法可以使用多索引和多级别列来创建一个值与更高级别索引的所有行相对应的列.

从视觉上看,我想要这样的东西:这在Pandas 身上可能吗?

|    |    |  a  |  b  |  c  | 
|----|----|-----|-----|-----|
|idx1|idx2|     |     |     |
|----|----|-----|-----|-----|
|    |  0 |     |  4  |  0  |
|  0 |----|  4  |-----|-----|
|    |  1 |     |  5  |  1  |
|----|----|-----|-----|-----|
|    |  0 |     |  6  |  2  |
|  1 |----|  8  |-----|-----|
|    |  1 |     |  5  |  1  |
|----|----|-----|-----|-----|

推荐答案

不幸的是,这是不可能的,Pandas 没有合并细胞的概念.

如果您想要"合并"连续的相同单元格,则必须使用多重索引来从该显示中受益(但仅限于初始级别),或者对html输出进行后处理以手动更改这些单元格的行跨度.

处理HTML的示例,部分使用pandas计算行跨度的大小,使用BeautifulSoup修改HTML:

from IPython.core.display import HTML
from IPython.display import display
from bs4 import BeautifulSoup
import re

def to_rowspan(s):
    m = s.ne(s.groupby(level=0).shift())
    sz = s.groupby(m.cumsum()).transform('size')
    return [f'[rowspan={size}]{val}' if mask else 'TO_DELETE'
            for size, mask, val in zip(sz, m, s)]

def merge_cells(df):
    reg = re.compile(r'\[rowspan=(\d+)\](.*)')
    soup = BeautifulSoup(df.apply(to_rowspan).to_html())
    
    for row in soup.find_all('td'):
        if row.text == 'TO_DELETE':
            row.decompose()
        elif (m:=reg.search(row.text)):
            a,b = m.groups() ; a = int(a)
            if a>1:
                row['rowspan'] = a
            row.string = b
    return soup.prettify()

display(HTML(merge_cells(df)))

输出:

enter image description here

Python相关问答推荐

使用Python更新字典中的值

Scrapy和Great Expectations(great_expectations)—不合作

如何启动下载并在不击中磁盘的情况下呈现响应?

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

在Python中计算连续天数

matplotlib图中的复杂箭头形状

如何在Great Table中处理inf和nans

Pandas—堆栈多索引头,但不包括第一列

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

仅使用预先计算的排序获取排序元素

如何编辑此代码,使其从多个EXCEL文件的特定工作表中提取数据以显示在单独的文件中

根据过滤后的牛郎星图表中的数据计算新系列

使用Scikit的ValueError-了解

Python:在cmd中添加参数时的语法

Django-修改后的管理表单返回对象而不是文本

搜索结果未显示.我的URL选项卡显示:http://127.0.0.1:8000/search?";,而不是这个:";http://127.0.0.1:8000/search?q=name";

打印:添加具有不同填充 colored颜色 的矩形

使用BeautifulSoap库从Web获取表格时没有响应

颂歌中的线性插值法(盖柯)

在每个子列表(2D列表)中返回2个以上的重复项