【问题标题】:ValueError: ('Series lengths must match to compare' when Using Pandas StyleValueError: ('当使用 Pandas 样式时,'系列长度必须匹配才能比较'
【发布时间】:2017-04-12 21:15:11
【问题描述】:

通过使用Pandas Style,我试图用条件格式突出显示那些从数据框(如下所示)中(按行和按列)子集的单元格:

例如,在对第 0 行和第 1 行以及“Adam”和“Gill”列的单元格进行子集化后,如果这些单元格的值大于其相应的目标值,我想将它们突出显示为绿色,如果小于则突出显示为橙色。

但是在运行代码时我不断收到以下错误:

ValueError: ('Series lengths must match to compare', u'occurred at index 0')

我能做些什么来解决这个问题?

这是我的代码:

import pandas as pd

def AboveTarget(s): # For dataframe style
    green = s > df["Target"]
    orange = s < df["Target"]
    return ["background-color: #86f922" if v else "background-color: #faebde" if w else "background-color: white" for v, w in zip(green, orange)]

df = pd.DataFrame({"Adam": [99.1, 95.2, 83.1],
                   "Gill": [99.2, 96.1, 81],
                   "Louis": [60, 71.5, 99.1],
                   "Target": [99, 98, 95]
                  })

html = (df.style.\
        apply(AboveTarget, subset = pd.IndexSlice[0:1, ["Adam", "Gill"]], axis = 1)
       )

html

【问题讨论】:

    标签: python html pandas dataframe


    【解决方案1】:

    通过使用subset,您将切片元素传递给函数AboveTarget。结合axis=1 参数sAboveTarget 将是DataFrame 中的行,即索引为["Adam","Gill"] 的Pandas 系列。您无法将其与 df["Target"] 进行比较,后者是一个索引为 [0,1,2] 的系列。

    你需要:

    import pandas as pd
    
    def AboveTarget(s): # For dataframe style
        green = s > s["Target"]
        orange = s < s["Target"]
        return ["background-color: #86f922" if v else "background-color: #faebde"\
            if w else "background-color: white" for v, w in zip(green, orange)]
    
    df = pd.DataFrame({"Adam": [99.1, 95.2, 83.1],
                   "Gill": [99.2, 96.1, 81],
                   "Louis": [60, 71.5, 99.1],
                   "Target": [99, 98, 95]
                  })
    
    html = (df.style.\
            apply(AboveTarget, subset = pd.IndexSlice[0:1, ["Adam", "Gill", "Target"]], axis = 1)
           )
    
    html
    

    将“目标”列传递给函数并与对应的s["Target"] 值进行比较。

    【讨论】:

      【解决方案2】:

      在 AboveTarget 中,您尝试将名为 spd.Series 与数据框 df 进行比较 - 这也恰好包含较少的元素... - 这就是它不起作用的原因。

      一种方法是执行以下操作:

      def AboveTarget(s, df): # For dataframe style
          green = s > df.loc[s.name, "Target"]
          orange = s < df.loc[s.name, "Target"]
          return ["background-color: #86f922" if v 
                  else "background-color: #faebde" if w 
                  else "background-color: white" 
                  for v, w in zip(green, orange)]
      
      html = (df.style.\
              apply(AboveTarget, subset = pd.IndexSlice[0:1, ["Adam", "Gill", "Louis"]],
                    axis=1, args=(df,))
             )
      
      html
      

      我将 df 作为参数传递。


      另一种我更喜欢的方式,因为它不需要如此复杂的 IndexSlice 并且不需要传递 df 作为额外参数,如下所示:

      def AboveTarget(s):
          green = s > s['Target']
          orange = s < s['Target']
          return ["background-color: #86f922" if v 
                  else "background-color: #faebde" if w 
                  else "background-color: white" 
                  for v, w in zip(green, orange)]
      
      html = (df.style.\
              apply(AboveTarget, subset = pd.IndexSlice[0:1], axis=1)
             )
      
      html
      

      因为Target 既不是&gt; Target 也不是&lt; Target 所以它会得到white 的背景颜色

      【讨论】:

        猜你喜欢
        • 2016-04-07
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 2019-08-24
        • 2017-03-25
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        相关资源
        最近更新 更多