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

Posted

技术标签:

【中文标题】如何从数据框中提取值以用于条件格式,同时一次将其应用于某些选择类别或数据条目?【英文标题】:How to extract values from dataframe to use in conditional formatting while applying it on certain select categories or data entries at a time? 【发布时间】:2019-02-04 23:44:01 【问题描述】:

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

Dataframe df9 DF for Median

【问题讨论】:

你可以分享数据框吗?以便我可以提供帮助 好的,如果是这样的话,用虚拟数据制作一个样本数据框并给出数据框。没有数据框我真的不能 Yogesh 我已经以图片的形式添加了它们 【参考方案1】:

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 数据框中的索引代表您的类别。因此,如果您想访问,例如 Month1_up 类别 0,只需切片: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)

【讨论】:

非常感谢,但问题的另一部分是,我如何将其用于选择性条件格式,例如,为类别 0 获取 Month1_low 和 Month1_up 的值并将条件格式设置为值数据中只属于第0类? 另外,如果我想对所有 3 个月的数据一起进行上述均值-标准/均值+标准计算,解决方案是什么? IE。所有 3 个月的 1 个均值 + 标准值和所有 3 个月的 1 个均值标准值。 我编辑添加了一种方法到 groupby 并一次花费你所有的月,尽管还有其他方法可以做到这一点。条件格式是什么意思? “数据”是指df9 或我称为agg 的数据框? 通过条件格式我的意思是设置一个标准 mean-std 我不习惯条件格式,所以我的做法可能不是 pythonic,但它是一个初学者。请告诉我它是否适用于您的数据框。

以上是关于如何从数据框中提取值以用于条件格式,同时一次将其应用于某些选择类别或数据条目?的主要内容,如果未能解决你的问题,请参考以下文章

在特定条件下从数据框中提取行

如何一次将值从数组中移出一个?

如何从pyspark中的数据框中选择一系列行

如何在 R 数据框中取消嵌套列表,同时保留键和值?

Python:如何从数据框中仅提取年月日[重复]

如何根据在熊猫数据框中的其他列上应用条件来提取列值