Reputation: 16
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
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