1. 程式人生 > 實用技巧 >pandas之表格樣式

pandas之表格樣式

在juoyter notebook中直接通過df輸出DataFrame時,顯示的樣式為表格樣式,通過sytle可對錶格的樣式做一些定製,類似excel的條件格式。

df = pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
s = df.style
print(s,type(s))
#<pandas.io.formats.style.Styler object at 0x000001CD7B409710> <class 'pandas.io.formats.style.Styler'>

對錶格建立樣式有兩種方式,都需要額外定義一個處理樣式的函式

①df.style.applymap(func,*args,**kwargs):對DataFrame中的每一個元素都按照func的邏輯處理

# 將小於0.2的值字型設定為紅色,否則設定為黑色
df = pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
def lt_red(val):
    if val<0.2:
        color = 'red'
    else:
        color = 'black'
#     print(color)
    return ('color:%s'%color)
df.style.applymap(lt_red)

②df.style.apply(func,axis=0,subset=**,*args,**kwargs):對DataFrame的行或列按照func的邏輯處理,axis預設為0按照列處理,1按照行處理。

# 將A、C、D列中的每一列最大值背景顏色填充為黃色
def highlight_max(s):
    is_max = s == s.max()
    l = []
    for v in is_max:
        if v:
            l.append(' padding: 0px; line-height: 1.8; color: rgb(128, 0, 0);">')
        else:
            l.append('')
#     print(l)
    return l
df.style.apply(highlight_max,axis = 1,subset = ['A','C','D'])

如果在style中需要同時進行行和列的切片,需要用到pandas的IndexSlice

# 對索引為2-5行,列為A、C、D中的每一列最大值背景顏色填充為黃色
df.style.apply(highlight_max,axis=1,subset = pd.IndexSlice[2:5,['A','B','C']])
## df.loc[2:5,['A','C']].style.apply(highlight_max,axis=1)也可以實現
## 上一種方法會顯示所有的DataFrame內容,然後對滿足條件的行和列做格式處理;而後一種方法是隻顯示滿足條件的行和列,再做格式處理

格式化DataFrame中的數值

df = pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
# df.style.format('{:.2%}',subset=['B','C'])  #對所有符合條件的採用一種格式format,整個格式用''括起來
df.style.format({'A':'{:.2f}','B':'{:%}','C':'{:+}','D':'{:.2%}'}) #對不同的列採用不同的format,引數為一個字典,key為列名,value為格式
# A、B、C、D列的格式分別為2位小數、百分數、前面加+號,2位小數的百分數

定位空值df.style.highlight_null(null_color='red'),對空值設定背景顏色

對應還有highlight_max()和highlight_min(),引數(subset=None, color='yellow', axis=0)

df = pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
df['B'][2] = np.nan
df.style.highlight_null(null_color='red')

色彩對映

df = pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
df.style.background_gradient(cmap='Reds',axis = 1,low = 0,high = 1,subset = ['A','C','D'])
# 按行處理,最小值對應顏色表中的最淺色,最大值對應顏色表中的最深色,1表示按行處理

條形圖

df = pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])
df.style.bar(width=100,subset=['A','C','D'],color='lightpink')

分段式構建樣式

df.style.\
    bar(width=100,subset=['A'],color='lightpink').\
    highlight_max(axis = 1,color='red').\
    highlight_min(axis = 1,color='green')
#除最後一行,每一行都以.\結尾

(轉)

https://www.cnblogs.com/Forever77/p/11336981.html

# 設定寬度
pd.set_option('display.width',100)
# 設定精確度
pd.set_option('precision',4)
# 設定顯示所有列
pd.set_option('display.max_columns',None)
# 設定顯示所有行
pd.set_option('display.max_rows',None)
參考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.set_option.html