3

I want my DataFrame last 3 rows to be printed bold. Below is my DataFrame structure, both in text and image (output from Jupyter Notebook) format.

# Actually, there are some more columns but it's not necessary to put them all here. 
# These columns are enough to give an example.
      epoch      loss  accuracy      f1_m  precision_m  recall_m     lr  
1       1.0  5.104000  0.494600  0.458400     0.588500  0.403900  0.001   
2       2.0  3.313200  0.801000  0.799500     0.828500  0.772600  0.001   
3       3.0  3.063600  0.825000  0.824400     0.852900  0.797700  0.001   
4       4.0  2.855900  0.838900  0.838600     0.865700  0.813100  0.001   
5       5.0  2.659400  0.847500  0.846100     0.876500  0.817800  0.001   
6       6.0  2.490200  0.851100  0.851600     0.876800  0.827900  0.001   
7       7.0  2.334100  0.854100  0.853400     0.880100  0.828200  0.001   
8       8.0  2.168300  0.862000  0.861800     0.885700  0.839100  0.001   
9       9.0  2.025500  0.864200  0.863800     0.888800  0.840300  0.001   
10     10.0  1.900300  0.864100  0.863900     0.889100  0.840200  0.001   
11     11.0  1.774600  0.866300  0.866200     0.888800  0.844700  0.001   
12     12.0  1.668100  0.867000  0.866000     0.891700  0.841700  0.001   
13     13.0  1.557800  0.869900  0.869600     0.893500  0.846900  0.001   
14     14.0  1.459500  0.871900  0.872000     0.895900  0.849400  0.001   
15     15.0  1.386500  0.869000  0.868600     0.892800  0.845700  0.001   
16     16.0  1.294400  0.872900  0.873000     0.895800  0.851400  0.001   
17     17.0  1.210600  0.876000  0.875700     0.898500  0.853900  0.001   
18     18.0  1.156100  0.875800  0.875600     0.897800  0.854500  0.001   
19     19.0  1.100800  0.872800  0.872100     0.897200  0.848300  0.001   
20     20.0  1.042000  0.875000  0.875200     0.897100  0.854400  0.001   
21     21.0  0.991800  0.875700  0.876400     0.899100  0.854900  0.001   
22     22.0  0.942500  0.878600  0.878300     0.900800  0.856900  0.001   
23     23.0  0.896600  0.878800  0.878400     0.901900  0.856200  0.001   
24     24.0  0.857100  0.880500  0.880200     0.901800  0.859700  0.001   
25     25.0  0.826900  0.878600  0.878400     0.900600  0.857300  0.001   
26     26.0  0.795000  0.878600  0.878100     0.901900  0.855600  0.001   
27     27.0  0.778700  0.876300  0.875800     0.900400  0.852500  0.001   
28     28.0  0.750800  0.876100  0.875700     0.899300  0.853300  0.001   
29     29.0  0.718600  0.878900  0.878900     0.901900  0.857000  0.001   
30     30.0  0.707000  0.876000  0.875400     0.899100  0.852900  0.001   
31     31.0  0.694900  0.875800  0.875900     0.900000  0.853100  0.001   
32     32.0  0.665100  0.879300  0.879100     0.900600  0.858600  0.001   
33     33.0  0.657700  0.875600  0.875400     0.899700  0.852500  0.001   
34     34.0  0.637700  0.878100  0.878100     0.901000  0.856300  0.001   
35     35.0  0.618600  0.880100  0.879500     0.902900  0.857300  0.001   
36     36.0  0.601200  0.880400  0.880600     0.902700  0.859600  0.001   
37     37.0  0.589900  0.882300  0.882100     0.903400  0.861800  0.001   
38     38.0  0.580500  0.880400  0.880600     0.901800  0.860400  0.001   
39     39.0  0.573000  0.880200  0.880300     0.902100  0.859600  0.001   
40     40.0  0.555900  0.882200  0.881700     0.904700  0.859900  0.001   
41     41.0  0.551200  0.880700  0.880300     0.902900  0.858800  0.001   
42     42.0  0.547500  0.880400  0.879900     0.903300  0.857600  0.001   
43     43.0  0.531100  0.883500  0.883500     0.905500  0.862600  0.001   
44     44.0  0.537000  0.880000  0.879500     0.903300  0.856900  0.001   
45     45.0  0.526200  0.883200  0.882200     0.904300  0.861200  0.001   
46     46.0  0.517900  0.882000  0.882300     0.903000  0.862500  0.001   
47     47.0  0.514400  0.881100  0.880900     0.902100  0.860700  0.001   
48     48.0  0.505000  0.883400  0.882700     0.904800  0.861600  0.001   
49     49.0  0.499200  0.883300  0.883600     0.904600  0.863500  0.001   
50     50.0  0.491200  0.884600  0.884700     0.905600  0.864800  0.001   
min     1.0  0.491200  0.494600  0.458400     0.588500  0.403900  0.001   
max    50.0  5.104000  0.884600  0.884700     0.905600  0.864800  0.001   
mean   25.5  1.285006  0.857558  0.855906     0.883479  0.832423  0.001  

enter image description here

For starters, I have tried using 2 answers from this post code to just test if it's working for the last row, but it didn't work.

Is there any other idea to style the DataFrame?

Just in case, I attach my current full code here:

import fileinput
import glob
import pathlib
import pandas as pd
import os
import numpy as np

def readText(filename):
    with open(filename, "r") as f:
        data = f.readlines()
    return data

# I want my DataFrame to be exported to Excel files later on
def toExcelFiles(filename, data_text):
    data = []
    for i, line in enumerate(data_text.split('\n')[1::2], start=1):
        obj = {}
        obj['epoch'] = i
        for x in line.split(' - ')[2:]:
            k, v = x.split(':')
            obj[k] = v.lstrip()
        data.append(obj)

    df = pd.DataFrame(data).astype(float)
    filename = filename.replace(".txt", ".xlsx")
    print(filename)
    df.index = np.arange(1, len(df) + 1)
    df.loc['min'] = df.min()
    df.loc['max'] = df.max()
    df.loc['mean'] = df.mean()
    df.style.applymap('font-weight: bold', subset=pd.IndexSlice[df.index[df.index=='mean'], :])
    with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
        print(df)
    df.to_excel(filename) 

# main
os.chdir(f'C:/Users/Dionisius/OneDrive/testresult/arsi 4/txt')
file_list = glob.glob("*.txt")
print("File_list: ", file_list)
print("*"*127)

for file in file_list:
    text = readText(file) # returns list
    string_epoch = ''.join(text) # mengubah list jadi string
    toExcelFiles(file, string_epoch)

Sample .txt file is attached here.

1 Answers1

2

Here you go:

def bold_last(df, numrows=3):
    ret = pd.DataFrame('', index=df.index, columns=df.columns)

    # last few rows
    ret.iloc[-numrows:] = 'font-weight:bold'

    return ret

# pass numrows=4 to `apply` to bold 4 last rows
df.style.apply(bold_last, axis=None).to_excel('some_file.xlsx')

And the last few rows would look like this:

enter image description here

Quang Hoang
  • 146,074
  • 10
  • 56
  • 74
  • that ```.iloc[-:]``` code is exactly what I'm looking for. Now I can also style the last row with ```background-color:yellow```. Thank you! – Dionisius Pratama Mar 13 '21 at 04:48