【问题标题】:Pandas Styling: Conditional FormattingPandas 样式:条件格式
【发布时间】:2020-11-15 15:12:10
【问题描述】:

我将以下格式应用于熊猫数据框。

数据如下:

{'In / Out': {'AAA': 'Out',
  'BBB': 'In',
  'Total1': 'Out',
  'CCC': 'In',
  'DDD': 'In',
  'Total2': 'In'},
 'Mln': {'AAA': '$-1,707',
  'BBB': '$1,200',
  'Total1': '$-507',
  'CCC': '$245',
  'DDD': '$1,353',
  'Total2': '$1,598'},
 'US$ Mln': {'AAA': '$-258',
  'BBB': '$181',
  'Total1': '$-77',
  'CCC': '$32',
  'DDD': '$175',
  'Total2': '$206'}}

  • 首先,我尝试将整个第三行和第六行加粗。而且我已经遇到了一个错误。
  • 其次,当第二列 == In 时,我希望第二、第三和第四列为绿色,如果第二列 == Out,则为红色。我该怎么做?
  • 第三,我希望只有文本“Total1”和“Total2”(不是整列)右对齐,同一列中的其他文本可以保持左对齐。

有人可以告诉我如何编码吗?

【问题讨论】:

    标签: python pandas dataframe pandas-styles


    【解决方案1】:

    你必须按照.loc使用pd.IndexSlice

    像这样。

    idx = pd.IndexSlice[['Total1', 'Total2'], :]
    # If you don't want to hard-code use this
    idx = pd.IndexSlice[df.index[[2, 5]], :]
    

    根据需要制作样式函数。

    # 1
    def make_bold(val):
        return 'font-weight: bold'
    # For italic use 'font-style: italic'
    # 2
    def apply_color(s):
        if s.isin(['In']).any():
            return ['color: green' for val in s]
        return ['color: red' for val in s]
    

    df.style.applymap 用于元素方面,df.style.apply 用于列/行方面。

    s = df.style.applymap(
        make_bold, subset=pd.IndexSlice[["Total1", "Total2"], :] # subset=idx
    ).apply(apply_color, axis=1)
    s
    

    输出:


    对于#3

    不能indexcolumns 上应用样式 同样根据pandas style-docs,在限制部分,

    您只能设置值的样式,而不是索引或列

    【讨论】:

      【解决方案2】:

      让我们试试applyaxis=1

      df.style.apply(lambda x: ['color:red' if x['In / Out']=='Out' 
                                 else 'color:green']*len(x), axis=1)
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多