如何从数据框中提取值以用于条件格式,同时将其一次应用于某些 select 类别或数据条目?

How to extract values from dataframe to use in conditional formatting while applying it on certain select categories or data entries at a time?

within the image 我正在尝试计算中位数和标准差,但它允许我一次只计算一列我想要一次计算所有三列然后将数据存储到另一个数据框中我想知道如何使用条件格式中指定的值并将其仅应用于相应的类别

Dataframe df9 DF for Median

IIUC 您想使用单个 groupby 对 Month1 Month2Month3 列执行计算吗?例如,您在代码底部的 mean - stdmean + std

您可以通过以下方式做到这一点:

np.random.seed(87) # Use this for reproducibility

df9 = pd.DataFrame(np.random.randint(0,3,(10,5)),\
      columns = ['Month1','Month2','Month3','Revised Category','useless column'])

agg = df9[['Month1','Month2','Month3','Revised Category']].\
      groupby('Revised Category').agg(lambda x: [x.mean()-x.std(),x.mean()+x.std()])

agg = pd.concat([pd.DataFrame.from_items(zip(agg.index, agg[col].values)).T for col in agg],axis=1)
agg.columns = ['Month1_low','Month1_up','Month2_low','Month2_up','Month3_low','Month3_up']

输出为:

    Month1_low  Month1_up   Month2_low  Month2_up   Month3_low  Month3_up
0   -0.414214   2.414214    -0.414214   2.414214    -0.207107   1.207107
1   -0.207107   1.207107    -0.207107   1.207107    -0.207107   1.207107
2   0.183475    2.149859    0.105573    1.894427    0.663340    2.336660

这个新 agg 数据框中的索引代表您的类别。因此,如果你想访问,对类别 0Month1_up,只需切片:agg.loc[0,'Month1_up'].

如果您想一次计算所有月份的平均值,您可以在 groupby 之前连接原始数据框,如下所示:

concatenated = pd.concat([df9[[col,'Revised Category']].rename({col:'Month'},axis = 1) \
                          for col in ['Month1','Month2','Month3']])
concatenated.groupby('Revised Category').agg(lambda x: [x.mean()-x.std(),x.mean()+x.std()])
agg2 = pd.DataFrame.from_items(zip(agg2.index, agg2.Month.values)).T
agg2.columns = ['Months_low','Months_up']

    Months_low  Months_up
0   -0.149859   1.816525
1   -0.047723   1.047723
2   0.344018    2.100426

编辑:

我不习惯为数据帧着色,所以这个解决方案可能很繁重且不是最理想的,但它在一个例子上有效。

首先,让我们重新组合来自 df9 的原始数据和我们用 groupby 计算的数据(有上限和下限):

months = ['Month1','Month2','Month3']
conc2 = pd.concat([df9.set_index('Revised Category')[[col]].join(\
        agg[[col+'_low',col+'_up']]) for col in months],axis = 1)

    Month1  Month1_low  Month1_up   Month2  Month2_low  Month2_up   Month3  Month3_low  Month3_up
0   2       -0.414214   2.414214    0       -0.414214   2.414214    0       -0.207107   1.207107
0   0       -0.414214   2.414214    2       -0.414214   2.414214    1       -0.207107   1.207107
1   1       -0.207107   1.207107    0       -0.207107   1.207107    0       -0.207107   1.207107

我们将使用它来创建一个掩码来编码,其中 Month 列之一的值高于相应的上限。

此蒙版随后将用于将所需颜色应用于数据框的样式。

mask = conc2.apply(lambda x: pd.Series([x[col]<x[col+'_low'] for col in months]),axis = 1)

mask.columns = months # the columns names need to be the same as conc2 for apply below

    Month1  Month2  Month3
0   False   False   False
0   False   False   False
1   False   False   False

现在我们已经创建了布尔掩码,我们需要用 pandas 中的 style 对象理解的相应颜色消息替换它的值。

mask = mask.reset_index(drop = True).apply(lambda x: x.map(\
       {True:'background-color: red',False:'background-color: None'}))

现在我们的掩码中有了这些字符串,我们只需要将它应用到数据框的样式中以彩色打印它。

conc2[months].reset_index(drop = True).style.apply(lambda x: mask, axis=None)