【问题标题】:Style rows of a dataframe based on column value根据列值对数据框的行进行样式设置
【发布时间】:2021-07-30 17:07:14
【问题描述】:

我有一个 csv 文件,我正在尝试将其读入 jupyter notebook 中的数据框和样式。 csv文件数据为:

[[' ', 'Name', 'Title', 'Date', 'Transaction', 'Price', 'Shares', '$ Value'],
[0, 'Sneed Michael E', 'EVP, Global Corp Aff & COO', 'Dec 09', 'Sale', 152.93, 54662, 8359460],
[1, 'Wengel Kathryn E', 'EVP, Chief GSC Officer', 'Sep 02', 'Sale', 153.52, 16115, 2473938],
[2, 'McEvoy Ashley', 'EVP, WW Chair, Medical Devices', 'Jul 28', 'Sale', 147.47, 29000, 4276630],
[3, 'JOHNSON & JOHNSON', '10% Owner', 'Jun 30', 'Buy', 17.00, 725000, 12325000]]

我的目标是设置行的背景颜色样式,以便如果 Transaction 列的值为“Buy”,则该行为绿色,如果 Transaction 列的值为“Sale”,则为红色。

我试过的代码是:

import pandas as pd

data = pd.read_csv('/Users/broderickbonelli/Desktop/insider.csv', index_col='Unnamed: 0')  

def red_or_green():
    if data.Transaction == 'Sale':
        return ['background-color: red']
    else:
        return ['background-color: green']

data.style.apply(red_or_green, axis=1)

display(data)

当我运行代码时,它会输出一个没有样式的电子表格,而不会给我一个错误代码:

Dataframe

我不太确定自己做错了什么,我已经尝试了多种不同的方法,但似乎无法让它发挥作用。任何帮助将不胜感激!

【问题讨论】:

  • 您要为整行着色还是只为列着色?
  • 如果可能,我正在尝试为整行着色。
  • @HenryEcker 我认为提议的欺骗与我们这里的不同,OP 已经知道 axis=1 这里。
  • 好的。如果他们通过添加行参数并返回带有 row.index 的系列而不是 red_or_green 中的列表将其应用于此函数,则对受骗问题的公认答案有效。

标签: python pandas dataframe jupyter pandas-styles


【解决方案1】:

如果要在条件匹配时比较整行,以下比 apply on axis=1 更快,我们在整个数据帧上使用样式:

def red_or_green(dataframe):
    c = dataframe['Transaction'] == 'Sale'
    a = np.where(np.repeat(c.to_numpy()[:,None],dataframe.shape[1],axis=1),
                 'background-color: red','background-color: green')
    return pd.DataFrame(a,columns=dataframe.columns,index=dataframe.index)

df.style.apply(red_or_green, axis=None)#.to_excel(.....)

【讨论】:

    【解决方案2】:

    试试

    data['background-color'] = data.apply(lambda x: red_or_green(x.Transaction), axis=1)
    
    
    def red_or_green(transaction):
        if transaction == 'Sale':
            return 'red'
        else:
            return 'green'
    

    或者你可以使用地图:

    data['background-color'] = data.Transaction.map(red_or_green)
    

    【讨论】:

    • 谢谢,当我尝试这两种方法时,它在 df 中添加了一个名为“background-color”的列,每行的值为“red”或“green”,但是行本身的背景颜色保持无样式
    • 抱歉,误读了您的问题。不确定样式数据框。尝试返回 ['background-color: yellow'] 并查看是否有效。希望其他人可以加入。
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 2020-05-15
    • 2017-12-11
    • 2021-02-27
    • 2020-08-05
    • 1970-01-01
    • 2012-09-03
    • 2020-08-19
    相关资源
    最近更新 更多