如何从数据框中提取值以用于条件格式,同时一次将其应用于某些选择类别或数据条目?
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
Month2
和 Month3
列执行计算?例如mean - std
和mean + 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以上是关于如何从数据框中提取值以用于条件格式,同时一次将其应用于某些选择类别或数据条目?的主要内容,如果未能解决你的问题,请参考以下文章