假设我在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相关问答推荐

如何根据日期和时间将状态更新为已过期或活动?

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

如何根据参数推断对象的返回类型?

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

在np数组上实现无重叠的二维滑动窗口

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

创建可序列化数据模型的最佳方法

使用Python和文件进行模糊输出

Tensorflow tokenizer问题.num_words到底做了什么?

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

使用SQLAlchemy从多线程Python应用程序在postgr中插入多行的最佳方法是什么?'

如何用FFT确定频变幅值

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

PySpark:如何最有效地读取不同列位置的多个CSV文件

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

EST格式的Azure数据库笔记本中的当前时间戳

使用pythonminidom过滤XML文件

如何在Python中画一个只能在对角线内裁剪的圆?

Pandas 数据框自定义排序功能