cryo_newtonian
cryo_newtonian

Reputation: 16

Rename Columns in Pandas Using Lambda Function Rather Than a Function

I'm trying to rename column headings in my dataframe in pandas using .rename().

Basically, the headings are :

column 1: "Country name[9]"
column 2: "Official state name[5]"

#etc.

I need to remove [number].

I can do that with a function:

def column(string):
    for x, v in enumerate(string):
        if v == '[':
           return string[:x]

But I wanted to know how to convert this to a lambda function so that I can use

df.rename(columns = lambda x: do same as function)

I've never used lambda functions before so I'm not sure of the syntax to get it to work correctly.

Upvotes: 0

Views: 3720

Answers (1)

furas
furas

Reputation: 142651

First you would have to create function which returns new or old value - never None.

def column(name):
    if '[' in name:
        return name[:name.index('[')]  # new - with change
    else:
        return name  # old - without change

and then you can use it as

df.rename(columns=lambda name:columns(name))

or even simpler

df.rename(columns=columns)

Or you can convert your function to real lambda

df.rename(columns=(lambda name: name[:name.index('[')] if '[' in name else name) )

but sometimes it is more readable to keep def column(name) and use columns=column. And not all constructions can be used in lambda - ie. you can't assing value to variable (I don't know if you can use new operator := ("walrus") in Python 3.8).


Minimal working code

import pandas as pd

data = {
    'Country name[9]': [1,2,3],
    'Official state name[5]': [4,5,6],
    'Other': [7,8,9],
}    
    
df = pd.DataFrame(data)

def column(name):
    if '[' in name:
        return name[:name.index('[')]
    else:
        return name

print(df.columns)

df = df.rename(columns=column)        

# or 

df = df.rename(columns=(lambda name: name[:name.index('[')] if '[' in name else name) )

print(df.columns)

Upvotes: 1

Related Questions