这是我的数据框:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(
    {
        'p': ['short', np.nan, 'short', np.nan, np.nan, 'long', 'long', np.nan, np.nan],
        's': [13, 13, 14, 15, 100, 1, 1000, 12, 1111]
    }
)

我想在Excel中将其他组(甚至组)的背景 colored颜色 更改为不同的 colored颜色 .

这就是我在Excel中想要的:

enter image description here

这些组是基于p来定义的.这是一个以p为单位的值,它下面的所有NaN个值是一个组.这一点在上图中很清楚.

这就是我试过的方法,但没有奏效:

from matplotlib import colors
def colr(x):
    y = x.assign(k=x['p'].ne(x['p'].shift()).cumsum())

    d = dict(enumerate(colors.cnames))
    y[:] = np.broadcast_to(y['k'].map(d).radd('background-color:').to_numpy()[:,None]
                          ,y.shape)
    return y.drop("k",1)

df = df.style.apply(colr,axis=None)
df.to_excel('file.xlsx', index=False, engine='openpyxl')

推荐答案

您可以通过测试不缺失值来创建GroupBy.cumsum的偶数组,并使用模2和整数除2正向填充值,最后使用您的解决方案映射 colored颜色 ,并按numpy.where为奇数组设置无 colored颜色 :

df = pd.DataFrame(
    {
        'p': ['short', np.nan, 'short', np.nan, np.nan,'short',np.nan, 
              'short', np.nan, 'long', 'long', np.nan, np.nan, 
              'long','long','long','long'],
        's': [13, 13, 14, 15, 100, 8,9,6,4,8, 1000, 12, 1111,7,8,79,87]
    }
)


from matplotlib import colors
def colr(x):
    p = x['p'].notna().groupby(x['p']).cumsum().ffill() 
    m = p % 2 == 1
    s = p // 2

    d = dict(enumerate(colors.cnames))
    out = np.broadcast_to(s.map(d).radd('background-color:').to_numpy()[:,None]
                          ,x.shape)

    return np.where(m.to_numpy()[:, None], '', out)

df = df.style.apply(colr,axis=None)
df.to_excel('file.xlsx', index=False, engine='openpyxl')

pic

Python相关问答推荐

除了Python之外,可以替代bare?

Polars -转换为PL后无法计算熵.列表

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

三个给定的坐标可以是矩形的点吗

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

从webhook中的短代码(而不是电话号码)接收Twilio消息

比较两个数据帧并并排附加结果(获取性能警告)

使用numpy提取数据块

对于一个给定的数字,找出一个整数的最小和最大可能的和

为什么默认情况下所有Python类都是可调用的?

两个pandas的平均值按元素的结果串接元素.为什么?

如何将多进程池声明为变量并将其导入到另一个Python文件

在pandas中使用group_by,但有条件

从嵌套的yaml创建一个嵌套字符串,后面跟着点

如何保持服务器发送的事件连接活动?

Tkinter菜单自发添加额外项目

如何更改groupby作用域以找到满足掩码条件的第一个值?

Matplotlib中的字体权重

从列表中获取n个元素,其中list [i][0]== value''

查看pandas字符列是否在字符串列中