【问题标题】:Painting cells using pandas and complex conditions [closed]使用 pandas 和复杂条件绘制细胞 [关闭]
【发布时间】:2022-02-09 05:25:10
【问题描述】:

我有一个数据框,其中包含几种化学元素的标准差、平均值和中位数。样本数据:

test = pd.DataFrame({('Na', 'std'):{'A': 1.73, 'B':0.95, 'C':2.95}, ('Na', 'mean'):{'A': 10.3, 'B':11, 'C':20}, ('Na', 'median'):{'A':11, 'B':22, 'C':34},('K', 'std'):{'A': 1.33, 'B':1.95, 'C':2.66}, ('K', 'mean'):{'A': 220.3, 'B':121, 'C':290}, ('K', 'median'):{'A':211, 'B':122, 'C':340}})

表格示例:

    Na                  K
    std     mean    med std     mean    med
A   1.73    10.3    11  1.33    220.3   211
B   0.95    11.0    22  1.95    121.0   122
C   2.95    20.0    34  2.66    290.0   340

我想在特定条件下绘制单元格:

  1. 我想为每个化学元素的 std 列中的两个最小值着色(例如:Na 为 0.95 和 1.73,K 为 1.33 和 1.95);
  2. 我想根据函数 [abs(mean - median)] 的两个最小值为所有元素(例如:(10.3, 11) 和 (11.0, 22) Na, 和 (220.3, 211) 和 (121, 122) 对于 K)。

我制作了这些函数来识别要按照我想要的条件绘制的单元格的值,但我不知道如何在 pd.style 函数中实现它们。

def paint1(test):
  val_keep = []
  for element,stats in test:
    if stats == 'std':
      paint1 = test[element].nsmallest(2, 'std')
      for value in paint1['std']:
        val_keep.append(value)
  return val_keep

def paint2(test):
val_keep = []
  for element,stats in test:
    if stats == 'mean':
      diff = abs(test[element]['mean'] - test[element]['median'])
      paint2 = diff.nsmallest(2).index
      for value in paint2:
        val_keep.append((test[element]['mean'][value]))
        val_keep.append(test[element]['median'][value])
  return val_keep

如何使用这些条件绘制单元格?我看到其他posts 使用 lambda 函数来定义样式,但我认为我需要的函数比这更复杂。

【问题讨论】:

  • 你好像忘了问一个问题。
  • 抱歉,我用问题编辑了文本
  • 从图像中复制数据很难。如果他们有可访问的数据,它可以帮助这里的人们。他们在这里解释stackoverflow.com/questions/20109391/…。 TL;DR print(df.to_dict()).
  • 如果没有看到您的任何数据或您编写的任何产生问题的代码,很难回答您的问题。请查看 Jon Skeet 的优秀博文 WRITING THE PERFECT QUESTION 以获取更新问题的指导。有关提出好问题的更详细教程,请参阅 Eric S. Raymond 的网站How To s The Smart Way
  • 我编辑并添加了dict格式的示例数据和我试图在pd.style函数中实现的函数。

标签: python pandas pandas-styles


【解决方案1】:

使用df.style:

def styler(col):
    chem, stat = col.name
    if stat == 'std':
        return np.where(col.isin(col.nsmallest(2)), 'color: red', '')
    elif stat in ['mean', 'median']:
        delta = (df[(chem, 'mean')] - df[(chem, 'median')]).abs()
        return np.where(delta.isin(delta.nsmallest(2)), 'color: blue', '')
    else:
        return [''] * len(col)

df.style.apply(styler)

【讨论】:

  • 感谢您的回答!您能否详细说明 col 的含义?
  • 调用style.apply 时,每列都会调用styler 函数。 col 是数据框中的单独列
猜你喜欢
  • 2010-09-24
  • 2015-03-20
  • 2019-08-09
  • 2021-08-05
  • 1970-01-01
  • 2014-07-27
  • 2015-10-09
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多