在两个数据框差异之间应用Pandas样式

时间:2019-03-08 19:59:05

标签: python html pandas

我已经发现了很多有关查找两个熊猫数据框之间差异的问题,但是在这里,我试图应用两个数据框之间的Pandas.Style差异。给定这两个示例数据帧,我希望将格式化程序应用于right [1,“ B”]和right [“ D”],因为它们与左值不同或通常是新的:

left = pd.DataFrame([[1,1,1], [2,2,2]], columns=list("ABC"))
right = pd.DataFrame([[1,1,10], [2,5,10]], columns=list("ABD"))

这是我对熊猫文档指导的格式化方法的想法

def formatter(s, new):
    if s.name not in new.columns:
        # column doesn't exist strike through entire thing
        return "color: red; text-decoration: line-through;"

    elif not s.equals(new[s.name]):
        # apply per value a comparision of the elements
        # for val in s: 
            # if val != right[val.index??]:
                return "color: red; text-decoration: line-through;"

    return "color: black;"

left.style.apply(formatter, args=(right))

我的想法是,之后我应该拥有类似html的内容:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>B</th>
      <th>C</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>2</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>B</th>
      <th>C</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1</td>
      <td style="color: red; text-decoration: line-through;">10</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td style="color: red; text-decoration: line-through;">5</td>
      <td style="color: red; text-decoration: line-through;">10</td>
    </tr>
  </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

目前还不清楚您到底被卡在哪里,但是代码并不遥远。

这可能是您想要的:

left = pd.DataFrame([[1,1,1], [2,2,2]], columns=list("ABC"))
right = pd.DataFrame([[1,1,10], [2,5,10]], columns=list("ABD"))
def formatter(s, new):
    if s.name not in new.columns:
        # column doesn't exist strike through entire thing
        return ["color: red; text-decoration: line-through;"]*len(s)

    elif not s.equals(new[s.name]):
        return ["color: red; text-decoration: line-through;" if v else "" for v in s == new[s.name]]

    return ["color: black;"]*len(s)

left.style.apply(formatter, args=[right])

格式化程序方法现在返回与输入形状相同的数据(根据文档)。

正确的数据帧作为列表而不是元组传递。

还更改了每个值比较,以在它们不同时返回颜色,否则保留默认样式。