February 7, 2023 · Python

How to use Python's f-strings with pandas

Python introduced f-strings back in version 3.6 (six years ago!), but I've only recently realized how useful they can be.

In this post, I'll start by showing you some simple examples of how f-strings are used, and then I'll walk you through a more complex example using pandas.

Here's what I'll cover:

Substituting objects:

name = 'Kevin'
age = 42
print(f'My name is {name}. I am {age} years old.')
My name is Kevin. I am 42 years old.

To make an f-string, you simply put an f in front of a string. By putting the name and age objects inside of curly braces, those objects are automatically substituted into the string.

Calling methods and functions:

role = 'Daddy'
print(f'Sometimes my 6-year-old yells: {role.upper()}!!!')
Sometimes my 6-year-old yells: DADDY!!!

Strings have an upper() method, and so I was able to call that method on the role string from within the f-string.

Evaluating expressions:

days_completed = 37
print(f'This portion of the year remains: {(365 - days_completed) / 365}')
This portion of the year remains: 0.8986301369863013

You can evaluate an expression (a math expression, in this case) within an f-string.

Formatting numbers:

print(f'This percentage of the year remains: {(365 - days_completed) / 365:.1%}')
This percentage of the year remains: 89.9%

This looks much nicer, right? The : begins the format specification, and the .1% means "format as a percentage with 1 digit after the decimal point."

Real-world example using pandas:

Recently, I was analyzing the survey data submitted by 500+ Data School community members. I asked each person about their level of experience with 11 different data science topics, plus their level of interest in improving those skills this year.

Thus I had 22 columns of data, with names like:

Each “experience” column was coded from 0 (None) to 3 (Advanced), and each “interest” column was coded from 0 (Not interested) to 2 (Definitely interested).

Among other things, I wanted to know the mean level of interest in each topic, as well as the mean level of interest in each topic by experience level.

Here's what I did to answer those questions:

cats = ['python', 'pandas']  # this actually had 11 categories
for cat in cats:
    mean_interest = df[f'{cat}_interest'].mean()
    print(f'Mean interest for {cat.upper()} is {mean_interest:.2f}')
    print(df.groupby(f'{cat}_experience')[f'{cat}_interest'].mean(), '\n')
Mean interest for PYTHON is 1.77
python_experience
0    1.590909
1    1.857143
2    1.781759
3    1.630769
Name: python_interest, dtype: float64 

Mean interest for PANDAS is 1.67
pandas_experience
0.0    1.500000
1.0    1.825806
2.0    1.709924
3.0    1.262295
Name: pandas_interest, dtype: float64 

Notice how I used f-strings:

Further reading:

P.S. This blog post originated as one of my weekly data science tips. Sign up below to receive data science tips every Tuesday! 👇

Comments powered by Disqus